1、描述

# 作用: 能够处理stdin并将其转换为特定命令的命令行参数
# 语法: command | xargs

2、参数

参数

描述

-n num

执行一行中显示的字段数,默认以空白和换行符分割每个参数

-d IFS

自定义定界符来分割参数

-a file

从文件中读入数据作为sdtin

-e flag、-E flag

flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止

-I {}

指定了替换字符串

-P num

一次运行的最大进程数(一般建议和cpu核实一致)

3、技巧

1、只要我们把"find"的输出作为"xargs"的输入,就必须将"-print0"与"find"结合使用,以字符"null('\0')"来分隔输出
比如: 用find匹配并列出所有的".txt"文件,然后用xargs将这些文件删除: find . -type f -name "*.txt" -print0 | xargs -0 rm -f这样就可以删除所有的".txt"文件;xargs -0将\0作为输入定界符

2、查询结果为空时处理方式 建议使用 -I 或 -i
[root@ /cdly/tmp]# ll /tmp/
总用量 0
[root@ /cdly/tmp]# ls /tmp/*.log 2>/dev/null|xargs ls
file
[root@ /cdly/tmp]# ls
file
[root@ /cdly/tmp]# ls /tmp/*.log 2>/dev/null|xargs -i ls {}
[root@ /cdly/tmp]#
[root@ /cdly/tmp]# >/tmp/a.log
[root@ /cdly/tmp]#
[root@ /cdly/tmp]# ls /tmp/*.log 2>/dev/null|xargs ls
/tmp/a.log
[root@ /cdly/tmp]# ls /tmp/*.log 2>/dev/null|xargs -i ls {}
/tmp/a.log

4、实例

[root@ /cdly]# cat file 
1 2 3
4 5 6 7
8 9 10

# -n num
# 在一行中显示
[root@ /cdly]# cat file |xargs # 输出:1 2 3 4 5 6 7 8 9 10
# 一行中显示三个字段
[root@ /cdly/tmp]# cat file |xargs -n 3
1 2 3
4 5 6
7 8 9
10

# -d IFS 以字符X进行分割字符
[root@ /cdly/tmp]# echo "splitXsplitXsplitXsplit" | xargs -d X # 输出:split split split split
[root@ /cdly/tmp]# xargs -a file echo # 输出:1 2 3 4 5 6 7 8 9 10
[root@ /cdly/tmp]# xargs -E '6' -a file echo # 输出:1 2 3 4 5
[root@ /cdly/tmp]# cat file | xargs -E '6' # 输出:1 2 3 4 5

[root@ /cdly/tmp]# cat a.txt
aa
bb
cc
[root@ /cdly/tmp]# cat a.sh
#!/bin/bash
echo $* '#'
[root@ /cdly/tmp]# cat a.txt | xargs -I {} sh a.sh -p {} -l
-p aa -l #
-p bb -l #
-p cc -l #

# -P num 指定并发的进程数量
[root@ /cdly/tmp]# time seq 5|xargs -n1 -P5 sleep

real 0m15.028s
user 0m0.000s
sys 0m0.003s

[root@ /cdly/tmp]# time seq 5|xargs -n1 -P5 sleep

real 0m5.004s
user 0m0.000s
sys 0m0.005s