Linux xarges

对于管道|之后的一部分命令可以用stdin进行输入,如:

cat a | grep test

但有些命令只能用参数形式,就要使用xargs了,xargs可以将stdin转化为参数,类似于find命令中的-exec选项。
xargs也可以将单行或多行文本进行重新格式化。
下面示例是将多行输入处理为单行输出:

[student@myhost ~]$ cat a
space: 
tab:	
[student@myhost ~]$ cat a | xargs
space: tab:

通过以上命令我们知道了通道符后直接跟xargs可以将多行变为单行。
通过xargs的-n选项可以让单行变为多行,-n后跟的数字为每行的参数数量,以IFS(默认空格)为分隔符:

[student@myhost ~]$ cat a
1 2 3 4 5 6 7 8
[student@myhost ~]$ cat a | xargs -n 3
1 2 3
4 5 6
7 8

我们也可以自定义分隔符,使用-d选项确定分隔符:

[student@myhost ~]$ echo "1a2a3a4a5" | xargs -d a -n 2
1 2
3 4
5

我们可以用xargs给命令输入参数:

[student@myhost ~]$ cat a                #a为要执行的文件
echo $*#
[student@myhost ~]$ bash a 1
1#
[student@myhost ~]$ bash a 1 2 3
1 2 3#
[student@myhost ~]$ cat args             #xargs文件内容为要输入的参数
1 2 3
[student@myhost ~]$ cat args | xargs -n 1 bash a
1#
2#
3#
[student@myhost ~]$ cat args | xargs -n 2 bash a
1 2#
3#
[student@myhost ~]$ cat args | xargs -n 3 bash a
1 2 3#

当我们需要以下形式的命令参数时:

 bash a -p arg1 -o

以上命令只有arg1可变,我们可以用xargs命令的-I(大写i)选项:

[student@myhost ~]$ cat args | xargs -I {} bash a -p {} -o
-p 1 2 3 -o#

我们发现命令只替换到了{}中。
在日常工作中有些常见的与find命令一起的错误用法如:

find . -type f -name "*.txt" | xargs rm -f

以上命令删除使用find查找出来的文件,但如果文件名中有空格就有可能误删文件。我们可以这样改进它:

find . -type f -name "*.txt" -print0 | xargs -0 rm -f

以上命令中find的-print0选项含义为使用\0作为两个文件的分隔符,xargs的-0选项是将\0作为xargs命令读取的分隔符,这样就不会误删了。
统计c程序文件的LOC:

[student@myhost ~]$ find . -name "*.c" -type f -print0 | xargs -0 wc -l
 1 ./b.c
 1 ./a.c
 2 总用量

我们知道xargs不能给提供一个以上的命令提供参数,但通过while和子Shell就可以完成:

 cat b.c | (while read args; do echo $args;done )
 相当于
 cat b.c | xargs -I {} echo {}

以上命令中,while循环里可以执行多个命令,从而可以给多个命令提供同一参数。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值