共计 3597 个字符,预计需要花费 9 分钟才能阅读完成。
本文丸趣 TV 小编为大家详细介绍“linux 管道符的作用是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux 管道符的作用是什么”文章能帮助大家解决疑惑,下面跟着丸趣 TV 小编的思路慢慢深入,一起来学习新知识吧。
在 linux 中,管道符“|”的作用是连接多条指令,前一条指令的输出流会作为后一条指令的操作对象,其命令格式为“指令 1 | 指令 2 | …”,该命令的后一条指令,必须能够接收标准输入流命令才能执行。管道符主要用于多重命令处理,前面命令的打印结果作为后面命令的输入。
管道是 Linux 中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入。常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别。
有名管道叫 named pipe 或者 FIFO(先进先出),可以用函数 mkfifo() 创建。
linux 中的 | 管道符
| 管道符的作用是连接多条指令,前一条指令的输出流会作为后一条指令的操作对象,其命令格式为“指令 1 | 指令 2 | …”,该命令的后一条指令,必须能够接收标准输入流命令才能执行。
管道命令的操作符是:”|”,它只能处理由前面一条指令传出的正确输出信息,对错误信息是没有直接处理能力的。然后,传递给下一条指令,作为操作对象。
语法:
指令 1 | 指令 2 | …
管道符主要用于多重命令处理,前面命令的打印结果作为后面命令的输入。简单点说就是,就像工厂的流水线一样,进行完一道工序后,继续传送给下一道工序处理…
举个栗子:对 hello.sh 文件进行排序去重以后找出包含 better 的行
命令为:cat hello.sh | sort | uniq | grep better’
查看文本
排序
去重
过滤
【1】第一道工序——查看文本
首先使用 cat 命令查看文本,打印到屏幕上内容即为 cat 命令的输出结果
[root@linuxforliuhj test]# cat hello.sh hello this is linux
be better
be better
i am lhj
hello this is linux
i am lhj
i am lhj
be better
i am lhj
have a nice day
have a nice day
hello this is linux
hello this is linux
have a nice day
zzzzzzzzzzzzzz
dddddddd
gggggggggggggggggggg[root@linuxforliuhj test]#
【2】第二道工序——排序
将前面 cat 命令输出的结果通过管道丢给 sort 命令,所以 sort 命令是对前面 cat 命令输出的文本进行排序
[root@linuxforliuhj test]# cat hello.sh | sortbe better
be better
be better
dddddddd
gggggggggggggggggggg
have a nice day
have a nice day
have a nice day
hello this is linux
hello this is linux
hello this is linux
hello this is linux
i am lhj
i am lhj
i am lhj
i am lhj
zzzzzzzzzzzzzz[root@linuxforliuhj test]#
【3】第三道工序——去重
前面介绍 uniq 的文章中提到,sort 跟 uniq 结合使用才能有效去重,所以通过管道将 sort 处理后输出的文本丢给 uniq 处理,所以 uniq 处理的是排序好的文本,可以进行有效去重
[root@linuxforliuhj test]# cat hello.sh | sort | uniqbe better
dddddddd
gggggggggggggggggggg
have a nice day
hello this is linux
i am lhj
zzzzzzzzzzzzzz[root@linuxforliuhj test]#
【4】第四道工序——过滤
最后一步过滤则同样是将前面命令即 uniq 命令处理后输出的文本进行过滤
[root@linuxforliuhj test]# cat hello.sh | sort | uniq | grep better be better[root@linuxforliuhj test]#
重点来了!
重点来了!
重点来了!
以上的 cat、sort、uniq、grep 等命令均支持管道符,是因为这些命令均可从标准输入中读取要处理的文本(即从标准输入中读取参数);而对于部分命令,例如 rm、kill 等命令则不支持从标准输入中读取参数,只支持从命令行中读取参数(即 rm 命令后面必须指定删除的文件或者目录,kill 命令后面必须要指定杀死的进程号等)
那什么样的命令支持管道,什么样的命令不支持管道呢?
一般情况下,处理文本的命令,例如 sort、uniq、grep、awk、sed 等命令均支持管道;像 rm、ls 这类的不是处理文本的命令均不支持管道
[root@linuxforliuhj test]# cat hello.sh | sortbe better
be better
be better
dddddddd
gggggggggggggggggggg
have a nice day
have a nice day
have a nice day
hello this is linux
hello this is linux
hello this is linux
hello this is linux
i am lhj
i am lhj
i am lhj
i am lhj
zzzzzzzzzzzzzz[root@linuxforliuhj test]#
sort 后面没有参数时,则对管道符丢给它的前一个命令的输出结果进行处理(即前一个命令的标准输出作为本次命令的标准输入)
[root@linuxforliuhj test]# lsbeifen.txt hello.sh mk read.ln read.sh read.txt sub.sh[root@linuxforliuhj test]# ls | grep read.shread.sh[root@linuxforliuhj test]# ls | grep read.sh | rmrm: missing operand
Try rm --help for more information.[root@linuxforliuhj test]#
当 rm 后面不指定删除的文件时,则会报错丢失参数,所以,rm 等命令不支持从标准输入读取参数,只支持在命令行指定参数,即指定删除的文件。
标准输入和命令行参数那个优先?
有如下两个文件
[root@linuxforliuhj test]# cat a.txt aaaa
bbbb[root@linuxforliuhj test]# cat b.txt 1111333344442222[root@linuxforliuhj test]#
执行命令:cat a.txt | sort
[root@linuxforliuhj test]# cat a.txt | sortaaaa
dddd[root@linuxforliuhj test]#
当 sort 的命令行参数为空时,默认使用前一个命令的输出结果作为本次命令的输入
执行命令:cat a.txt | sort b.txt
[root@linuxforliuhj test]# cat a.txt | sort b.txt 1111222233334444[root@linuxforliuhj test]#
可以看到,当 sort 的命令行参数(此处为 b.txt)不为空时,sort 不会读取标准输入里的参数,而时读取命令行参数
执行命令:cat a.txt | sort b.txt –
[root@linuxforliuhj test]# cat a.txt | sort b.txt -1111222233334444aaaa
dddd[root@linuxforliuhj test]#
– 表示标准输入,即命令 cat a.txt 的输出,相当与对文件 b.txt 和标准输入一起进行排序,相当于 sort a.txt b.txt
[root@linuxforliuhj test]# sort a.txt b.txt1111222233334444aaaa
dddd[root@linuxforliuhj test]#
读到这里,这篇“linux 管道符的作用是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注丸趣 TV 行业资讯频道。