深入学习链接:Linux 的进程间通信:管道 - 知乎 (zhihu.com)
Linux管道符|命令使用详解_linux中|的用法-优快云博客
一、什么是管道?
管道(pipe),在任何一个shell中,都可以使用“|”连接两个命令,shell会将前后两个进程的输入输出用一个管道相连,以便达到进程间通信的目的。管道本质上就是一个文件,前面的进程以写方式打开文件,后面的进程以读方式打开。这样前面写完后面读,于是就实现了通信。Linux系统直接把管道实现成了一种文件系统,借助VFS给应用程序提供操作接口。
虽然实现形态上是文件,但是管道本身并不占用磁盘或者其他外部存储的空间。在Linux的实现上,它占用的是内存空间。所以,Linux上的管道就是一个操作方式为文件的内存缓冲区。
二、管道的作用
“|”是Linux管道命令操作符,简称管道符。使用此管道符“|”可以将两个命令分隔开,“|”左边命令的输出就会作为“|”右边命令的输入,此命令可连续使用,第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
语法:command1 | command2 |command3 |...
原理:
三、管道的使用
1.管道符的基础使用
1)单个管道符
[root@master ~]# rpm -qa | grep 'httpd'
httpd-tools-2.4.6-99.el7.centos.1.x86_64
httpd-2.4.6-99.el7.centos.1.x86_64
2)复合管道符
[root@master etc]# netstat -lntp | awk 'NR==3 {print $4}' | awk -F':' '{print $2}'
53
2.管道符配合参数传递
1)xargs
对(ls cp rm)管道不能执行。所以通过xargs。
①xargs命令
xargs 命令给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs 能够处理管道或者 stdin 并将其转换成特定命令的命令参数。xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。xargs 的默认命令是 echo,空格是默认定界符。这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。xargs 是构建单行命令的重要组件之一。
②xargs的语法:
cat a.txt | xargs -i cp {} /目录
- {}:前面传过来的内容一行一行赋值
- -i :为了让大括号生效
- 解释:前面传过来的东西交给大括号
ls -l 后面可以不加大括号,直接执行。
③xargs的选项
-n 选项 多行输出
-d 选项 自定义一个定界符
-t
选项 打印出xargs
执行的命令
-p
选项 会在执行每一个命令时弹出确认-I 选项 指定一个替换字符串{}
④xargs的使用
[root@master tmp]# touch /tmp/file{1..5}
[root@master tmp]# cat files.txt
/tmp/file1
/tmp/file2
/tmp/file3
/tmp/file4
/tmp/file5
[root@master tmp]# cat files.txt | ls -l #然后观察结果
[root@master tmp]# cat files.txt | rm -rvf #然后观察结果
[root@master tmp]# echo $?
0
可以看到直接使用管道符,命令没有按照我们的预期执行,但$?返回值依旧为0,下面使用xargs命令传参:
[root@master tmp]# cat files.txt |xargs ls -l
-rw-r--r-- 1 root root 0 Nov 11 14:49 /tmp/file1
-rw-r--r-- 1 root root 0 Nov 11 14:49 /tmp/file2
-rw-r--r-- 1 root root 0 Nov 11 14:49 /tmp/file3
-rw-r--r-- 1 root root 0 Nov 11 14:49 /tmp/file4
-rw-r--r-- 1 root root 0 Nov 11 14:49 /tmp/file5
[root@master tmp]# cat files.txt |xargs rm -rvf
removed ‘/tmp/file1’
removed ‘/tmp/file2’
removed ‘/tmp/file3’
removed ‘/tmp/file4’
removed ‘/tmp/file5’
成功执行!
[root@master tmp]# cat files.txt | xargs -i cp -rvf {} /tmp/
‘/opt/file1’ -> ‘/tmp/file1’
‘/opt/file2’ -> ‘/tmp/file2’
‘/opt/file3’ -> ‘/opt/file3’
‘/opt/file4’ -> ‘/tmp/file4’
‘/opt/file5’ -> ‘/tmp/file5’
2)exec
①exec命令
exec命令 用于调用并执行指令的命令。exec命令通常用在shell脚本程序中,可以调用其他的命令。如果在当前终端中使用命令,则当指定的命令执行完毕后会立即退出终端。
②exec的语法
command1 -exec command2 {} /目录 \;
- exec 对之前查找出来的文件做进一步操作
- {} 为前面查找到的内容
- \; 格式
③exec的选项
-c:在空环境中执行指定的命令。
④exec的使用
exec命令对之前查找出来的文件做进一步操作----- 查找带ifcfg开头的文件复制到tmp下
[root@master tmp]# rm -rf file*
[root@master tmp]# ls
ifcfg-ens33
ifcfg-lo
3)-exec和xargs的区别
-exec:参数是一个一个传递的,传递一个参数执行一次命令。
xargs:将前一个命令的标准输出传递给下一个命令,作为它的参数转换成下一个命令的参数列表。
1、exec 每处理一个文件或者目录,它都需要启动一次命令,效率不好;
2、exec 格式麻烦,必须用 {} 做文件的代位符,必须用 \来转义; 作为命令的结束符,书写不便。
3、xargs不能操作文件名有空格的文件;综上,如果要使用的命令支持一次处理多个文件,并且也知道这些文件里没有带空格的文件,那么使用 xargs比较方便; 否则,就要用 exec了。