本文要为大家介绍的命令是 xargs,我们把它称为护花使者,因为它总是乐于协助其他的命令来完成一些事情。下面一起来看看它是如何护花的。

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

坊间有一种说法,将 xargs 解读为乘号(x)和参数(args)的合体,很形象地表达了 xargs 的作用所在。

好了,我们一起来见识一下 xargs 的护花本领吧:

我们用ls命令列出当前路径下的文件, 包括3个文件

[roc@roclinux ~]$ ls
china.txt usa.txt japan.txt

我们通过xargs + ls的方式列出my.txt文件和your.txt文件

[roc@roclinux ~]$ echo "china.txt usa.txt" | xargs ls
china.txt usa.txt

可以很清晰地看到,xargs 将 echo 的输出作为自己的标准输入,并且将其传递给了 ls 命令,作为 ls 命令的参数来执行。

xargs 和管道不得不说的故事

为了能够为大家解释清楚 xargs 和管道的关系,我们这次选用了更加典型的 cat 命令来为大家举例。

为什么选择 cat 命令呢?众所周知,cat 命令可以接收文件名作为参数,执行后会显示出文件的内容。但是 cat 命令不能直接从标准输入接收参数,正如下面的例子:

cat后面直接指定china.txt参数, 可以展示china.txt文件的内容

[roc@roclinux ~]$ cat china.txt
hello beijing

我们尝试通过标准输入把参数传给cat, 结果却只是显示了文件名而已

[roc@roclinux ~]$ echo china.txt | cat
china.txt

从上面的例子中,我们可以得出下面的结论:

管道可以实现:将前面的标准输出作为后面的“标准输入”。

管道无法实现:将前面的标准输出作为后面的“命令参数”。

这个时候,就要有请 xargs 这位护花使者了。xargs 所擅长的正是“将标准输入作为其指定命令的参数”。说着有些拗口,但我相信大家懂的。

xargs果然不负众望, 协助cat完成了使命

[roc@roclinux ~]$ echo china.txt | xargs cat
hello beijing

我们知道,xargs 会将前一个命令的标准输出转换成命令参数,但很多人可能不知道的是,xargs 的标准输入中出现的“换行符、空格、制表符”都将被空格取代。下面来看一个带有换行符的例子:

我们准备好了带有换行的标准输入

[roc@roclinux ~]$ echo -e "china.txt\njapan.txt"
china.txt
japan.txt

可见, 换行符和空格的作用一样

[roc@roclinux ~]$ echo -e "china.txt\njapan.txt" | xargs cat
hello beijing
hello tokyo

上面的例子是一个比较简单的场景,我们有时还会遇到更棘手的情况,一起来看一看。

当命令参数中包含了空格时,情况就会复杂很多,一起来看一个示例。

我们创建了3个日志文件, 且故意让文件名称中都含有空格

[roc@roclinux ~]$ for((i=0;i<3;i++)); do touch "test ${i}.log";done

我们列出创建的文件

test 0.log
test 1.log
test 2.log

我们来运行xargs命令, 发现报错了

[roc@roclinux ~]$  find . -name '*.log' -print | xargs rm
rm: cannot remove ‘./test’: No such file or directory
rm: cannot remove ‘1.log’: No such file or directory
rm: cannot remove ‘./test’: No such file or directory
rm: cannot remove ‘0.log’: No such file or directory
rm: cannot remove ‘./test’: No such file or directory
rm: cannot remove ‘2.log’: No such file or directory

我们在当前目录中创建了 3 个文件,文件名中间都含有空格。但当 find 命令获取到的文件名经过 xargs 传送给 rm 命令时,文件“./test 1.log”就变成了“./test”和“1.log”两个文件了。即原本 3 个文件名刹那间就变成了 6 个文件名,而这 6 个文件其实并不存在,从而引发了错误。

这个错误的根源就在于 xargs 默认的分隔符是空格,如果我们能将 xargs 的分隔符改成其他符号,问题就迎刃而解了!

xargs 提供了-0选项,允许将 NULL 作为分隔符,而 find 命令也心有灵犀地提供了对应的选项来产生以 NULL 字符作为分隔符的输出。

find 命令提供的对应方法是 -print0 选项,在文件名之后输出 NULL,而不像 -print 选项那样输出换行符(换行符会被 xargs 替换成空格)。

正如我们所期待的,命令果然正常执行了,完美!

[roc@roclinux ~]$ find . -name '*.log' -print0 | xargs -0 rm -f

对了,要补充一点,xargs 的-0选项不仅可以将分隔符从默认的空格变成 NULL,还会将单引号、双引号、反斜线等统统默认为是普通字符。所以说,-0选项特别适合处理命令参数中含有引号、空格、反斜线的情况。

如果你是一位 GEEK,希望掌握得更深入,那么我们就再补充一个知识点。除了可以使用-0选项外,其实还可以使用-d选项来指定任何一个符号作为分隔符。只是我们要格外慎重,避免我们所设定的那个分隔符恰好是我们命令参数中所包含的字符,那就会导致非预期的结果了。

让护花使者听我们的话

如果在前一个命令的标准输出中,会有一些参数是你不希望或者不确定是否要传送给后面命令的,这个时候我们就希望 xargs 在传送参数前和我们确认一下。而-p选项恰好可以实现这个愿望,我们可以输入 y 或者 n 来选择是否要执行当前命令:

[roc@roclinux ~]$ find . -type f |xargs -p rm -f
rm -f ./china.txt ./usa.txt ./japan.txt ?...n

上面的命令中,我们输入了“n”,也就是不希望删除这三个文件。不过,这样的确认粒度太粗,我们希望的是更精细地确认,来试试-n选项吧:

[roc@roclinux 20160408]$ find . -type f |xargs -p -n 1 rm -f
rm -f ./china.txt ?...n
rm -f ./usa.txt ?...y
rm -f ./japan.txt ?...n

使用-n选项,可以让 xargs 每次只处理 1 个参数,这样做的好处是避免一次性删除过多文件,万一误删了不该删除的文件,那麻烦就大了。

遇到就停止

xargs 已经足够优秀了,可以帮助我们处理各种各样的问题。但我们对 xargs 还有更加苛刻的要求,那就是当碰到某个特定的命令参数时,要求 xargs 立即终止并退出。

这个效果,我们可以使用-E选项来实现。

比如,我们正在处理一份日志文件 country.list 中的内容,将日志文件中的字符以空行作为分隔符依次 echo 出来,一旦遇到 korea 便终止退出:

[roc@roclinux ~]$ echo "china usa korea japan" > country.list

[roc@roclinux ~]$ cat country.list
china usa korea japan [roc@roclinux ~]$ cat country.list | xargs -E 'korea' echo
china usa

可以看到当处理到 korea 的时候,xargs 机警地发现了状况,于是,按照我们的要求,立即终止并退出了。好乖的 xargs 啊!

你可能一生都不会遇到的参数过长报错

可能很多运维工程师都没有遇到过“Argument list too long”这样的报错。但要想成为一名资深的运维工程师,了解它的原因和解决方法还是很有必要的。

我们来模拟一个这样的场景,新建 10 万个日志文件,并且尝试用 rm 命令一次性删除:

[roc@roclinux ~]$ for((i=0;i<100000;i++)); do touch test${i}.log;done

[roc@roclinux ~]$ rm $(find . -type f -name '*.log')
-bash: /bin/rm: Argument list too long

出现了“Argument list too long”报错,这说明 rm 可接受的参数长度达到了极限。这其实并非 rm 的错,而是系统限制了参数的长度。通过下面的命令可以查看到系统的参数长度限制值:

[roc@roclinux ~]$ getconf ARG_MAX
2621440

如果真的遇到了参数过长的问题,我们的应对方法其实有很多种,比如把文件手工分组以缩短参数的长度,但是这个方法并不优雅,而且费时费力。最优雅的方法当然就是借助 xargs 啦:

[roc@roclinux ~]$ find . -name '*.log' -print | xargs rm

借助 xargs,并利用管道的特性,find 命令将输出的内容分段传给 rm 命令,而不是一股脑儿地塞过去。这样一来,rm 命令可以先处理最先获取的一部分文件,然后再处理下一批,并一直继续下去,直到全部删除为止。

好了,xargs 这位护花使者是不是既聪明又听话呢,在运维过程中,尝试使用起来吧,你会事半功倍的!

xargs命令_Linux xargs命令:一个给其他命令传递参数的过滤器的更多相关文章

  1. 以cmd命令行方式执行php文件时,传递参数

    1. php自带的两个参数$argc, $argv: 1.1. $argv : (后面的v是variables的意思),传递进来的参数会以数组的方式保持在这个变量里 1.2. $argc : (后面的 ...

  2. 每天一个 Linux 命令(21):find命令之xargs

    在使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行.但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出 ...

  3. 每天一个linux命令(21):find命令之xargs

    在使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行.但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出 ...

  4. 每天一个Linux命令(21)--find命令之xargs

    在使用 find 命令的 -exec 选项处理匹配到的文件时, find 命令将所有匹配到的文件一起传递给 exec 执行,但有些系统对能够传递给 exec 的命令长度有限制,这样在 find 命令运 ...

  5. (转)每天一个linux命令(21):find命令之xargs

    原文:http://www.cnblogs.com/peida/archive/2012/11/15/2770888.html https://blog.csdn.net/ly1358152944/a ...

  6. 【转】每天一个linux命令(21):find命令之xargs

    原文网址:http://www.cnblogs.com/peida/archive/2012/11/15/2770888.html 在使用 find命令的-exec选项处理匹配到的文件时, find命 ...

  7. 每天一个linux命令(文件操作):【转载】find命令之xargs

    在使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行.但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出 ...

  8. N天学习一个linux命令之xargs

    用途 标准输入流读取参数(空格或者换行符分隔),传递给需要执行的命令 用法 xargs [options] [command [initial-arguments]] 常用选项 --arg-file= ...

  9. find命令之xargs

    在使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行.但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出 ...

随机推荐

  1. 吴裕雄--天生自然KITTEN编程:一箭穿心

  2. 使用 Git 删除本地仓库和远端仓库文件

    使用 git bash 来删除 一.将文件(夹)添加到暂存区 这里假设本地和远端都有一个 test.txt 文件先在本地删除,通过 ·git status 查看通过git add test.txt 添 ...

  3. hexo博客的学习笔记

    这篇文章主要的作用是作为 .md文件打开,内部的格式为一个初学者对hexo以及markdown语法运用的笔记 1.Hexo的写文格式 最开始为文章的属性部分,以三横杠-开始,-结束.里面记录了文章的标 ...

  4. 这些科学家用DNA做的鲜为人知事,你估计都没见过!

    DNA世界的每一步都给人类带来奇妙甚至吃惊的发现.研究人员越来越多地探索和掌握了生命中的分子.生物与技术之间的界限以前所未有的方式模糊,有时甚至更糟.但DNA也为复杂疾病带来简单的答案,存储奇怪的文件 ...

  5. Redis(3)——分布式锁深入探究

    一.分布式锁简介 锁 是一种用来解决多个执行线程 访问共享资源 错误或数据不一致问题的工具. 如果 把一台服务器比作一个房子,那么 线程就好比里面的住户,当他们想要共同访问一个共享资源,例如厕所的时候 ...

  6. IP 数据报

    IP 数据报 1.IP 数据报的格式 一个 IP 数据报由首部和数据两部分组成.(数据报也可以说是数据包) 首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的. 在首部的固定部分 ...

  7. 7-41 jmu-python-最佳身高 (10 分)

    最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高).下面就请你写个程序,为任意一位用户计算他/她的情侣的最佳身高. 输入格式: 输入第一行给出正整数N(≤10),为前来查询的用 ...

  8. tomcat启动出现问题,有待解决

    三月 15, 2017 2:23:41 下午 org.apache.tomcat.util.digester.SetPropertiesRule begin警告: [SetPropertiesRule ...

  9. react-native 使用leanclound消息推送

    iOS消息推送的基本流程 1.注册:为应用程序申请消息推送服务.此时你的设备会向APNs服务器发送注册请求.2. APNs服务器接受请求,并将deviceToken返给你设备上的应用程序 3.客户端应 ...

  10. 前端小微团队的Gitlab实践

    疫情期间我感觉整个人懒散了不少,慢慢有意识要振作起来了,恢复到正常的节奏.最近团队代码库从Gerrit迁移到了Gitlab,为了让前端团队日常开发工作有条不紊,高效运转,开发历史可追溯,我也查阅和学习 ...