xargs

xargs 可以将 stdin 中以空格或换行符进行分隔的数据,形成以空格分隔的参数(arguments),传递给其他命令。因为以空格作为分隔符,所以有一些文件名或者其他意义的名词内含有空格的时候,xargs 可能会误判。简单来说,xargs 是给其他命令传递参数的一个过滤器,是构建单行命令的重要组件之一。










之所以要用到 xargs,是因为很多命令不支持使用管道 来传递参数,例如:


find /sbin -perm +700 | ls -l //这个命令是错误,因为标准输入不能作为ls的参数
find /sbin -perm +700 | xargs ls -l //这样才是正确的

2.命令格式
xargs [options] [command]
1
3.选项说明
-0:如果输入的stdin含有特殊字符,例如反引号`、反斜杠\、空格等字符时,xargs可以将它还原成一般字符。为xargs的默认选项。
-e ,-E ,--eof=:eof是end of file string的意思。flag可以是一个字符串或者是由空格分隔的多个字符串,当xargs分析到这个flag时,就会停止工作。见示例2。
-p:当每次执行一个argument的时候询问一次用户。
-n :表示命令在执行的时候一次使用的argument的个数,由num指定,默认是用所有的参数。
-t:表示先打印命令,然后再执行。
-a :从文件中读入作为sdtin。
-i[replace-str]:告诉xargs可以使用{}代替从标准输入读取的参数,可以指定替代字符串replace-str,如果没有指定,默认为{}。建议使用-I,其符合POSIX标准。
-I [replace-str]:将xargs的输出每一项参数,单独赋值给后面的命令,参数需要用指定的代替字符串replace-str代替,也就是说replace-str不可缺省,必须显示指明,可以使用{} $ @等符号,其主要作用是当xargs command后有多个参数时,调整参数位置。例如:find . -name "*.txt"|xargs -I {} cp {} /tmp/{}.bak。
-r:或者--no-run-if-empty,当xargs的输入为空的时候则停止xargs,不用再去执行后面的命令了,-r是xargs的默认选项。
-s :命令行的最大字符数,指的是xargs后面那个命令的最大命令行字符数,包括命令、空格和换行符。每个参数单独传入xargs后面的命令。见示例4。
-L :设置标准输入中最大的行数作为命令每一次执行的参数。见示例5。
-d , --delimiter=: xargs处理标准输入默认是按换行符和空格作为分隔符,输出arguments的分隔符是空格,这里修改xargs处理标准输入时的分隔符。
-x:eXit的意思,主要是配合-s使用,当命令行字符数大于-s指定的数值时,退出xargs。
-P:修改最大的进程数,默认是1,为0时候为as many as it can。该选项比较少用,目前还不清楚该用法。
4.常用示例
(1)将 Shell 的特殊字符还原为一般字符。



[b3335@MIC ~]$ echo ‘01234 56789’|xargs -t echo
echo 01234 56789
01234 56789
如果直接进行如下操作,会报无法找到命令 01234 的错误,因为反引号在 Shell 中会将 01234 作为一个命令来执行,但是 01234 不是一个命令。-t 表示先打印命令,然后再执行。



[b3335@MIC ~]$ echo 01234 56789
-bash: 01234: command not found
56789
(2)设置 xargs 读入参数时的结束标识,以逗号结束。这里要注意结束标志必须要是单独的字段,即以空格或者换行符分隔的字段。



[b3335@MIC ~]$ echo 01234 , 56789|xargs -E “,”
01234
(3)使用 rm、mv 等命令同时操作多个文件时,有时会报 “argument list too long” 参数列表过长的错误,此时可以使用 xargs 来解决。xargs 将标准输入的字符串分隔后,作为参数传递给后面的命令。例如,给当前目录的所有文件添加后缀名。










ls xargs -t -i mv {} {}.bak


#选择符合条件的文件
ls|grep -E “201701|201702|201703|201704|201705|201706|201707|201708|201709|201710” |xargs -i mv {} {}.bak
(4)设置命令行的最大字符数。参数默认一个一个单独传入命令中执行。



[b3335@MIC test]$ echo “01234 56789”|xargs -t -s 11
echo 01234
01234
echo 56789
56789
(5)设置标准输入中每次多少行作为命令的参数,默认是将标准输入中所有行的归并到一行一次性传给命令执行。



[b3335@MIC test]$ echo -e “01234\n56789\n01234” | xargs -t -L 2 echo

echo 01234 56789
01234 56789
echo 01234
01234
(6)将文件内容以空格分隔同行输出。



//列出文件内容
cat test.txt
a b c d e
f g h i j
k l m n o



//多行输入单行输出:
cat test.txt | xargs
a b c d e f g h i j k l m n o
(7)与 ps、grep、awk 和 kill 结合,强制终止指定进程。



ps -ef | grep spp | awk ‘{printf “%s “,$2}’ | xargs kill -9
1
ps -ef|grep spp用于查找包含 spp 的进程,awk ‘{printf “%s “,$2,FNR}将目标进程 ID 打印输出,xargs kill -9则将目标进程 ID 作为参数传递给kill -9用于杀死进程。


Category linux