Linux 管道与参数传递(xargs&exec)

深入学习链接: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了。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值