Linux随笔06
第六章 I/O重定向与管道
6.1 I/O重定向
I/O重定向:I/O重定向是一种操作系统的功能,它允许用户将标准输入(stdin)和标准输出(stdout)重定向到其他文件或设备上。通过使用I/O重定向,用户可以将程序的输入和输出从默认的终端改变为文件或其他设备。
使用I/O重定向将程序的输出重定向到一个文件中,这样程序的输出就会被写入到该文件中,而不是显示在终端上。
在Linux中,可以使用特殊的符号来实现I/O重定向。例如,使用">"符号可以将程序的输出重定向到一个文件中,使用"<"符号可以将文件的内容作为程序的输入。此外,还有一些其他的符号和命令可以用于更复杂的I/O重定向操作。
用快捷键重新打开一个终端:Ctrl+Alt+T
eg.打开一个终端3,输入date命令,会显示当前时间。如果在date命令后加“>”并指向date.txt文件,那么结果就会写入date.txt文件。接着打开一个终端4,将终端3的date输出结果重定向到终端4
文件描述符:每一个进程在运行中都会打开一个文件,每一个文件都会有一个指定的数字标识,这个标识就叫文字描述符
文件描述符通常是非负整数,0、1、2这三个文件描述符是绝大多数进程都有的。0表示标准输入,可以理解为键盘输入;1表示标准输出,输出到终端;2表示标准错误,输出到终端;3及以上为常规文件的描述符。当一个文件被打开时,操作系统会分配一个文件描述符给该文件,并返回给应用程序。应用程序可以使用文件描述符进行对文件的读写操作,比如使用文件描述符作为参数调用read()和write()函数。
文件描述符发的含义:
文件描述符 | 通道名 | 说明 | 默认连接 | 用法 |
0 | stdin | 标准输入 | 键盘 | 只读 |
1 | stdout | 标准输出 | 终端 | 只写 |
2 | stderr | 标准错误 | 终端 | 只写 |
3+ | filename | 其他文件 | 无 | 可读可写/只读/只写 |
文件描述符的使用可以让应用程序和操作系统之间进行有效的交互,使得应用程序能够访问和操作文件。在进行I/O重定向时,文件描述符可以被重新指定到其他文件或设备上,从而改变程序的输入和输出。
eg.在/proc下随机查看一个进程打开的文件
重定向:在Linux系统中,重定向是一种将程序的输入或输出重定向到其他地方的方式。它可以将命令的输出发送到文件中,或者将文件作为命令的输入。
cat命令默认文件描述符为0,输入重定向把键盘输入改为/etc/hosts文件输入
[root@localhost suli]# cat linux linux suli suli [root@localhost suli]# cat 0 < /etc/hosts
6.1.1 输出重定向
输出重定向:是一种将命令的输出结果重定向到指定位置的技术。在Linux系统中,通过使用特殊的符号和命令,可以将命令的输出结果重定向到文件、设备、管道等不同的位置。
通过输出重定向,可以将命令的输出结果保存到文件中,以便后续使用或分析;也可以将命令的输出结果传递给其他命令或程序进行处理。
输出重定向分为正确输出和错误输出
正确输出:1>、1>> 等价于>、>>,1可以省略
错误输出:2>、2>>
其中,“>”表示覆盖,“>>”表示追加
&>:将命令的正确结果和错误结果都输出到相同的位置
2>&1:将命令的错误输出和标准输出合并重定向到一个文件中
6.1.2 输入重定向
输入重定向:将外部数据(如文件、管道或其他程序)注入到进程中的技术。在Linux系统中,输入重定向符号为`<`。
grep命令是Linux系统中的一个强大工具,用于在文件或文本中搜索指定的模式。
eg.使用grep命令过滤root,没有改变输入端,默认为键盘,接着把输入重定向到/etc/passwd
加或不加“<”符号,输出结果都一样,但原理不一样。/etc/passwd一个是作为文件,一个是作为参数。
dd命令是Linux系统中一个非常实用的工具,主要用于复制(拷贝)文件和转换文件。它的全称是“data duplicator”,可以看作是Linux世界的搬运工。dd命令对于所有设备和文件都一视同仁,既可以用于备份,也可以用于快速复制系统环境
eg.使用dd命令从/dev/zero中读取数据并写入到file01.txt文件,每写入1MB,一共写入两次
使用输入重定向与输出重定向的方式也可以实现同样的功能
at 命令:是 Linux 系统中用于定时执行任务的命令。它可以将任务提交到队列中,并指定在特定的时间执行。
eg.使用at命令创建一个计划任务,从现在开始5分钟后创建用户linux,按组合键Ctrl+d结束
若同时创建多个用户,以此方法从键盘输入会十分繁琐,使用输入重定向会非常方便
6.1.3 重定向综合案例
eg.利用重定向建立多行文件(命令行)
使用echo命令重定向并不能建立多行文件,一般使用cat命令,在键盘上输入文本按回车键换行,完成后按组合键Ctrl+d结束
“>”表示覆盖,但在此处是指覆盖原来的file03.txt,输入的3行文本一次输出到file03.txt。如果退出后再次输出,那将覆盖掉先前的文本内容,此时就需要用“>>”进行追加。
每次写入文本都需要按组合键Ctrl+d结束显得比较繁琐,用户可以自定义一个结束的符号,通常使用"EOF"。
eg.利用重定向建立多行文件(脚本)
命令行和脚本都可以操纵Shell。在命令行中可以用组合键Ctrl+d退出,但在脚本中不可以。下面利用脚本创建多行文件,在脚本文件中写入文件,并加入“EOF”结束符号
使用bash执行该脚本:
[root@localhost suli]# bash create_file.sh [root@localhost suli]# cat file200.txt 111 222 aaa bbb EOF
在编写脚本时,为了排版整齐,经常在“EOF”前面使用tab键缩进,同时在输入重定向符后添加“-”
[root@localhost suli]# vim create_file.sh cat >file300.txt <<-EOF 111 222 aaa bbb EOF [root@localhost suli]# cat file300.txt 111 222 aaa bbb
eg.多条命令输出重定向
如果需要将两条命令输出重定向,则需要添加括号
让命令在后台运行,并且输出重定向到文件
终止后台程序
6.1.4 Subshell
Subshell是指圆括号里的命令会在另外的进程中执行。当需要让一组命令在不同的目录下执行时,采用这种方法可以不修改主脚本的目录。
对比不加圆括号的命令与加圆括号的命令,如下所示:
如果不希望某些命令的执行对当前Shell环境产生影响,请在Subshell中执行
6.2 进程管道
进程管道是一种在Linux系统中用于将多个进程连接起来以实现数据流动的机制。通过将一个进程的输出与另一个进程的输入相连接,可以实现数据的传递和处理。
管道实际上也是一种重定向,重定向字符控制输出到文件,管道控制输出到其他程序
管道的作用是把上一个进程的输出作为下一个进程的输入,利用管道可以把若干个命令连接在一起
通过使用管道,我们可以将多个命令连接在一起,实现复杂的数据处理操作。这种方式非常灵活,可以根据实际需求组合不同的命令来完成特定的任务。 需要注意的是,管道连接的命令需要按照顺序依次执行,并且每个命令的输入和输出需要符合预期的格式和约定。另外,管道会将前一个命令的输出直接传递给下一个命令,因此在处理大量数据时,需要注意管道的性能和资源消耗。
eg.将etc/passwd/中的用户按UID数值大小排序并显示前3行
其中,“-t”指定字段分隔符,“-k”指定字段,“-n”表示按数值大小排序
eg.指定出最占CPU的5个进程
eg.统计/etc/passwd中用户使用的Shell类型
取出第7列(Shell) | 排序(把相同项归类)| 去重
awk是一个非常强大的文本处理工具,可以快速提取出有用的信息。“-F”表示指定字段分隔符,默认为空格,这里以“:”作为分隔符;“$7”表示第7个字段;整条命令表示取出/etc/passwd文件的第7列
使用管道符“1”,添加sort命令进行排序(把相同项归类)
添加uniq命令,去掉重复的Shell类型
添加“-c”统计出每种Shell类型的数量
tee命令能被用来重定向管道的输出,到标准输出和指定文件中
tee命令在需要同时将命令的输出显示在终端上并保存到文件中时非常有用。它可以帮助用户在数据处理过程中保存输出结果,同时仍然能够查看处理的进展和结果。
tee命令的功能类似于生活中的三通水管,一条输入满足两个需求。在执行Linux命令时,一个进程标准输出通过管道作为下一个进程的标准输入,同时通过tee管道重定向一个文件或终端
若要把输出保存在文件中,又要在终端上看到输出内容,就可以使用tee命令
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!