◆ 作用:把从标准输入接收到的数据重新格式化,再将其作为参数重新提供给其它命令。
◆ 示例:
◆ 把命令的输出转换成一行显示
[root@web2]# MegaCli -PDList -aAll|grep -E 'Slot Number:|Raw Size:|Firmware state:'|awk '{print $3}'|xargs
4 286102MB Unconfigured(good) 5 286102MB Unconfigured(good) 0 140014MB Online 1 140014MB Online 2 140014MB Online 3 140014MB Online
◆ 把命令输出的一行内容转换成多行显示
[root@web2]# cat dell_diskstats.txt |awk '{print $3}'|xargs -n 3|sort
0 140014MB Online
1 140014MB Online
2 140014MB Online
3 140014MB Online
4 286102MB Unconfigured(good)
5 286102MB Unconfigured(good)
◆ 将输入转换成一列参数
tom@Ubuntu:$cat example.txt
1 2 3 4 5
6 7 8 9 10
tom@Ubuntu:$cat example.txt | xargs
1 2 3 4 5 6 7 8 9 10
◆ 单行输入转换成多行输出(-n)
tom@Ubuntu:$cat example.txt | xargs -n 2
1 2
3 4
5 6
7 8
9 10
◆ 使用自定义定界符分隔参数(-d)
tom@Ubuntu:$echo "TomXisXaXboy." | xargs -d X
Tom is a boy.
◆ 读取 stdin,将格式化参数传递给命令
以下为可执行脚本内容,作用为显示它的每一个参数:
tom@Ubuntu:$cat cecho.sh
#!/bin/bash
#File name: cecho.sh
#Description: This shell shows how to use xargs.
echo $* '#'
tom@Ubuntu:$./cecho.sh arg1 arg2 arg3
arg1 arg2 arg3 #
以下是 args 的使用示例 :
tom@Ubuntu:$cat args.txt | xargs -n 1 ./cecho.sh
arg1 #
arg2 #
arg3 #
tom@Ubuntu:$cat args.txt | xargs -n 2 ./cecho.sh
arg1 arg2 #
arg3 #
通过以下方式可以知道,这样是一次带不超过最大个数(-n 指定)的参数的一次或者多次执行:
tom@Ubuntu:$cat args.txt | xargs -n 2 bash -x ./cecho.sh
+ echo arg1 arg2 '#' ---- 执行的第一个命令
arg1 arg2 #
+ echo arg3 '#' ---- 执行的第二个命令
arg3 #
下面这个就是带三个参数的一次执行了:
tom@Ubuntu:$cat args.txt | xargs bash -x ./cecho.sh
+ echo arg1 arg2 arg3 '#'
arg1 arg2 arg3 #
对于带有多个参数,且只有一个会变化的参数,其它不变的,可以使用 xargs 的 -I 选型,指定替换字符串,实现命令对于每一个参数的一次执行(由结果可见,效果是每次一个参数的一次执行):
tom@Ubuntu:$cat args.txt | xargs -I {} bash -x ./cecho.sh -p {} -I
+ echo -p arg1 -I '#' ---- 替换为第一个参数执行一次
-p arg1 -I #
+ echo -p arg2 -I '#' ---- 替换为第二个参数执行一次
-p arg2 -I #
+ echo -p arg3 -I '#' ---- 替换为第三个参数执行一次
-p arg3 -I #
◆ 使用 xargs 进行统计
统计文件行数,如统计 source 目录下所有 .c 文件的行数。
tom@Ubuntu:$find . -type f -name "*.c" -print0 | xargs -0 wc -l
4 ./test2.c
4 ./test3.c
16 ./file_oper.c
24 总用量
-print0 将 \0 作为 find 找到的每一个结果的结束符,即 find 找到的结果将以 \0 分界,而不是 \n,-0 则用来识别 \0 这个定界符。