xargs 命令简介

569 阅读4分钟

命令格式

xargs [-0opt] [-E eofstr] [-I replstr [-R replacements]] [-J replstr] [-L number] [-n number [-x]] [-P maxprocs] [-s size] [utility [argument ...]]

功能

xargs 从标准输入流读取输入内容,并以空格、tab、换行以及文件结束符(EOF)分割为字符串,然后使用这些字符串为参数调用utility命令。
调用utility命令时,命令行显示定义的utility参数argument会拼接从标准输入流读取的字符串参数。utility命令会多次执行,直到标准输入流中的内容全部读取。
如果argument参数包含tab、换行,可以使用引号或者"""进行转译 注意:如果没有定义utility命令,默认使用echo;xargs从标准输入流中读取内容时可能发生错误;如果完整的utility命令无法被组装,或者不能被调用,或者在调用过程中被终止,或者调用返回255,xargs将立即退出。

选项

  • -t 在执行utility命令前,想标准错误流打印最终的命令(调试非常有用)
  • -p 在执行utility命令前,询问用户是否同意执行,否则跳过。
  • -0 用来分割输入流的分割符将切换为"\0"(空格、tab、换行将不再被识别为分割符而被保留)
  • -n 从标准输入流中读取几个分割后的参数,执行一次utility命令
  • -L 从标准输入流中读取几个非空行的参数,执行一次utility命令,和-n参数互斥,最后定义的那个选项被启用。
  • -E 自定义读取输入流时的文件结束符(可以提前结束读取输入)
  • -I 对argument中的格式字符串,使用输入流读取的字符串进行格式替换,而不是拼接。注意:格式字符串如果在argument中出现多次,默认只替换5次。可以用-R选项修改这个限制。但替换后的参数长度不能超过255字节,如果没有发生替换,则长度不受限制。但如果开启了-x选项,参数长度仍然受相应的限制。
  • -R 限制-I选项的最大替换次数。如果这个值是负值,替换可以进行无限次。
  • -s 限制utility命令最终参数的最大字节数长度。
  • -x 如果utility命令最终参数长度超过限制,则立即停止执行。
  • -J 对argument中的格式字符串,使用输入流读取的字符串进行格式替换,而不是拼接。注意:格式字符串如果在argument中出现多次,仅替换首次匹配。无法与-R同时使用。
  • -P 一次可并行执行执行utility命令的最大进程数。
  • -o 在执行utility命令前,为子进程重新打开标准输入流作为/dev/tty(当使用xargs运行一个交互式的程序非常有用)。

示例

文件 args.txt

a b c d efg h
I j k l
M n lek; ; gps
Bank account
Tosd. 
tsl
  1. 按照分割参数个数读取
[heping@heping-MacBook-Pro-Ninja:~]$cat ~/Desktop/args.txt | xargs -t -n 2 -- echo 

输出结果

echo a b
a b
echo c d
c d
echo efg h
efg h
echo I j
I j
echo k l
k l
echo M n
M n
echo lek; ;
lek; ;
echo gps Bank
gps Bank
echo account Tosd.
account Tosd.
echo tsl
tsl
  1. 按照行数读取
[heping@heping-MacBook-Pro-Ninja:~]$cat ~/Desktop/args.txt | xargs -t -L 2 -- echo 

输出结果

echo a b c d efg h I j k l
a b c d efg h I j k l
echo M n lek; ; gps Bank account
M n lek; ; gps Bank account
echo Tosd. tsl
Tosd. tsl
  1. -I 默认最多替换5个
[heping@heping-MacBook-Pro-Ninja:~]$cat args.txt | xargs -t -n 2 -I %  -- echo % % % % % %

输出结果

echo a b a b a b a b a b %
a b a b a b a b a b %
echo c d c d c d c d c d %
c d c d c d c d c d %
echo efg h efg h efg h efg h efg h %
efg h efg h efg h efg h efg h %
echo I j I j I j I j I j %
I j I j I j I j I j %
echo k l k l k l k l k l %
k l k l k l k l k l %
echo M n M n M n M n M n %
M n M n M n M n M n %
echo lek; ; lek; ; lek; ; lek; ; lek; ; %
lek; ; lek; ; lek; ; lek; ; lek; ; %
echo gps gps gps gps gps %
gps gps gps gps gps %
echo Bank account Bank account Bank account Bank account Bank account %
Bank account Bank account Bank account Bank account Bank account %
echo Tosd. tsl Tosd. tsl Tosd. tsl Tosd. tsl Tosd. tsl %
Tosd. tsl Tosd. tsl Tosd. tsl Tosd. tsl Tosd. tsl %
  1. -R 10 修改最多替换10次
[heping@heping-MacBook-Pro-Ninja:~]$cat ~/Desktop/args.txt | xargs -t -n 2 -R 10  -I  %  -- echo % % % % % %

输出结果

echo a b a b a b a b a b a b
a b a b a b a b a b a b
echo c d c d c d c d c d c d
c d c d c d c d c d c d
echo efg h efg h efg h efg h efg h efg h
efg h efg h efg h efg h efg h efg h
echo I j I j I j I j I j I j
I j I j I j I j I j I j
echo k l k l k l k l k l k l
k l k l k l k l k l k l
echo M n M n M n M n M n M n
M n M n M n M n M n M n
echo lek; ; lek; ; lek; ; lek; ; lek; ; lek; ;
lek; ; lek; ; lek; ; lek; ; lek; ; lek; ;
echo gps gps gps gps gps gps
gps gps gps gps gps gps
echo Bank account Bank account Bank account Bank account Bank account Bank account
Bank account Bank account Bank account Bank account Bank account Bank account
echo Tosd. tsl Tosd. tsl Tosd. tsl Tosd. tsl Tosd. tsl Tosd. tsl
Tosd. tsl Tosd. tsl Tosd. tsl Tosd. tsl Tosd. tsl Tosd. tsl
  1. -J 只能替换一次
[heping@heping-MacBook-Pro-Ninja:~]$cat ~/Desktop/args.txt | xargs -t -n 2 -J %  -- echo % xxxx %

输入结果

echo a b xxxx %
a b xxxx %
echo c d xxxx %
c d xxxx %
echo efg h xxxx %
efg h xxxx %
echo I j xxxx %
I j xxxx %
echo k l xxxx %
k l xxxx %
echo M n xxxx %
M n xxxx %
echo lek; ; xxxx %
lek; ; xxxx %
echo gps Bank xxxx %
gps Bank xxxx %
echo account Tosd. xxxx %
account Tosd. xxxx %
echo tsl xxxx %
tsl xxxx %