xargs命令的使用方式

导读

xargs 是给命令传递参数的一个过滤器,可以将管道或标准输入的数据转换成参数,默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行,不过通过 xargs 的处理,换行将被空格取代。

如何使用xargs命令

语法:

xargs [OPTIONS] [COMMAND [initial-arguments]]

举一个例子:我们用管道符传输到xargs,并为每个参数运行touch命令,-t表示在执行之前先打印,创建三个文件:

[root@localhost ~]# echo "file1 file2 file3"|xargs -t touch
touch file1 file2 file3

如何限制参数的数量

默认情况下,传递给命令的参数数量由系统限制决定。-n选项指定要传递给命令的参数个数。xargs根据需要多次运行指定的命令,直到所有参数都用完为止。

下面例子指定每次传递一个参数:

[root@localhost ~]# echo "file1 file2 file3"|xargs -n1 -t touch
touch file1 
touch file2 
touch file3

如何运行多个命令

要使用xargs运行多个命令,请使用-i或者-I选项。在-i或者-I后面自定义一个传递参数符号,所有匹配的项都会替换为传递给xargs的参数。

下面例子时xargs运行两条命令,先touch创建文件,然后ls列出来:

[root@localhost ~]# echo "file1 file2 file3"|xargs -t -I % sh -c 'touch %;ls -l %'
sh -c touch file1 file2 file3;ls -l file1 file2 file3 
-rw-r--r--. 1 root root 0 Jan 30 00:18 file1
-rw-r--r--. 1 root root 0 Jan 30 00:18 file2
-rw-r--r--. 1 root root 0 Jan 30 00:18 file3

如何指定一个分隔符

使用-d或者–delimiter选项设置自定义分隔符,可以是单个字符,也可以是以\ 开头的转义字符。

下面例子使用#做分隔符,echo命令使用了-n选项,意思是不换行输出:

[root@localhost ~]# echo -n file1#file2#file3#file4|xargs -d \# -t touch
touch file1 file2 file3 file4

如何从文件中读取条目

xargs命令还可以从文件读取条目,而不是从标准输入读取条目。使用-a选项,后跟文件名。
创建一个ip.txt的文件,一会使用xargs命令ping里面的每一个地址:

[root@localhost ~]# cat ip.txt 
114.114.114.114
www.linuxprobe.com
202.102.128.68

使用-L 1选项,该选项表示xargs一次读取一行。如果省略此选项,xargs将把所有ip传递给一个ping命令。

root@node1:~# xargs -a ip.txt -t -L 1 ping -c 1
ping -c 1 114.114.114.114 
connect: Network is unreachable
ping -c 1 172.50.10.100 
PING 172.50.10.100 (172.50.10.100) 56(84) bytes of data.
64 bytes from 172.50.10.100: icmp_seq=1 ttl=64 time=0.188 ms

--- 172.50.10.100 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.188/0.188/0.188/0.000 ms
ping -c 1 172.50.10.142 
PING 172.50.10.142 (172.50.10.142) 56(84) bytes of data.
64 bytes from 172.50.10.142: icmp_seq=1 ttl=64 time=0.146 ms

--- 172.50.10.142 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.146/0.146/0.146/0.000 ms

xargs与find一起使用

xargs通常与find命令结合使用。您可以使用find搜索特定文件,然后使用xargs对这些文件执行操作。

若要避免包含换行符或其他特殊字符的文件名出现问题,请始终使用find的-print0选项,这样可以使find打印完整的文件名,配合xargs命令使用-0或者–null选项可以正确的解释。
(”-print0”以空字符“\0”作为分隔符)

下面例子中,查找log文件夹下面的类型为file的所有文件,打包压缩起来:

[root@localhost ~]# find log/ -type f -print0|xargs --null tar -zcvf logs.tar.gz
log/anaconda/anaconda.log
log/anaconda/syslog
log/anaconda/program.log
log/anaconda/packaging.log
log/anaconda/storage.log
log/anaconda/ifcfg.log
log/anaconda/ks-script-TOLvJc.log
log/anaconda/ks-script-VRY9yQ.log
log/anaconda/ks-script-pjDijm.log
log/anaconda/journal.log
log/audit/audit.log
log/boot.log
log/boot.log-20200126
log/btmp
log/btmp-20200126
…
[root@localhost ~]# ll
total 604
-rw-------. 1 root root   1285 Dec 21 17:19 anaconda-ks.cfg
drwxr-xr-x. 8 root root   4096 Jan 29 23:02 log
-rw-r--r--. 1 root root 607566 Jan 30 00:58 logs.tar.gz

分割行为之:xargs -0

(更详细的内容引自 https://blog.csdn.net/coeus7/article/details/104487111)
xargs -0的行为和xargs -d基本是一样的,只是-d是指定分隔符,-0是指定固定的\0作为分隔符。其实xargs -0就是特殊的xargs -d的一种,它等价于xargs -d"\0"。

xargs -0行为如下:

xargs -0是分割阶段的选项,所以它优先于分批选项(-n、-L、-i)。
xargs -0不是先xargs再-0处理的,它是区别于独立的xargs的另一个分割选项。
xargs -0可以处理接收的stdin中的null字符(\0)。如果不使用 -0选项或- -null选项,检测到\0后会给出警告提醒,并只向命令传递非\0段。xargs -0和- -null是一样的效果。
xargs -0整体执行有几个阶段:

替换:将接收stdin的所有的标记意义的符号替换为\n,替换完成后所有的符号(空格、制表符、分行符)变成字面意义上的普通符号,即文本意义的符号。
分段:将检测到的null字符(\0)使用标记意义上的空格来分段,由于分段前所有符号都是普通字面意义上的符号,所以有的分段中可能包含了空格、制表符、分行符。也就是说除了-0导致的分段空格,其余所有的符号都是分段中的一部分。如果没有检测到\0,则接收的整个stdin将成为一个不可分割的整体,任何分批选项都不会将其分割开,因为它只有一个段。
输出:最后根据指定的分批选项来输出。这里需要注意,分段前后有特殊符号时会完全按照符号输出。
根据上面的结论可知,xargs -0会忽略所有文本意义上的符号,它的主要目的是处理\0符号。

[root@node2 tmp]# touch "one space.log"
[root@node2 tmp]#  ls | tr " " "\t" | xargs -0    #忽略文本意义上的制表符
a
b
c
d
logdir
one     space.log
one_space.log
shdir
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值