xargs(和管道不能不说的故事)

举报
技术火炬手 发表于 2017/11/01 10:09:34 2017/11/01
【摘要】 xargs = x + args (乘号和参数的合体)是execute arguments的缩写。作用是从标准输入中读取内容并将其传递给它要协助的命令,并作为那个命令的参数来执行。xargs和管道间的关系管道: 将前面的标准输出作为后面的“标准输入”xargs:将前面的标准输出作为后面的“命令参数”举例:管道将echo命令的标准输出转换成标准输入,然后xargs将其作为ls命令的参数,如果没有x

xargs = x + args (乘号和参数的合体)

是execute arguments的缩写。作用是从标准输入中读取内容并将其传递给它要协助的命令,并作为那个命令的参数来执行。


xargs和管道间的关系

管道:  将前面的标准输出作为后面的“标准输入”

xargs:将前面的标准输出作为后面的“命令参数”

举例:

image.png

管道将echo命令的标准输出转换成标准输入,然后xargs将其作为ls命令的参数,如果没有xargs则无法实现该命令,上述命令等价于:

image.png


再举个xargs和管道的例子:

image.png

cat命令不能直接从标准输入接受参数,此时需要使用xargs将标准输入转换成命令参数传递给cat命令。


再看一个我们在排查类工作经常使用到的find+xargs+grep来完成查询的例子:

image.png

在指定的目录下找到包含suse字样的后缀名为.txt的全部文件。


xargs另一个常用用法:将参数分段传递给命令,防止命令参数过长导致命令执行失败

1)创建50万个临时文件

image.png

2)尝试用rm一次性删除掉这类log文件

image.png

命令报错,提示rm命令后面的参数过长,这里可以用到xargs的协助:

image.png

find命令查找到的结果通过管道的作用下传递给了管道后面xargs,xargs将参数分段传递给了rm命令,如是rm命令能够分段来处理文件名。


xargs进阶:

1) -0选项

xargs默认的分隔符是空格,可以使用-0选项将NULL作为分隔符,此时需要配套find命令的 -print0选项。

举例:

image.png

由于创建的文件名包含空格,导致使用xargs rm时由于xargs默认的分隔符是空格,因此rm命令执行的并不是

test0 .log一个整体,而是test0和.log两部分,由于实际不存在这两部分文件,因此rm会报错找不到文件。

解决方法,使用xargs的-0选项结合find命令的-print0选项:

image.png


2) -E选项

遇到特定的命令参数时就立即终止并推出;


3)-p选项

确认式执行命令;输入y或者n来选择是否要执行当前命令

例如删除当前目录下的普通文件,使用-p参数,那么在rm执行时就会得到确认的反馈,这里我们输入了n,意思是不执行。

image.png

总结:xargs通常配套管道一起使用,擅长将标准输入作为其制定命令的参数;并且是分段式的传递命令参数;且可以通过-0、-E、-p等选项达到不同的效果。


题外:为什么find和xargs经常一起出现?☹

find和xargs同属于Unix系统中的大名鼎鼎的findutils软件包,包含了如下4个命令:

(1)find

(2)xargs

(3)locate

(4)updatedb


作者|何佳若

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。