Linux Shell 学习笔记 ---- xargs

来源:互联网 发布:防蹭网软件哪个最好 编辑:程序博客网 时间:2024/04/28 05:53

声明:以下内容绝大部分作为笔记摘自《Linux Shell 脚本攻略》(Sarath Lakshman 著,门佳译)一书,特此声明并致谢!

作用:把从 stdin 接受到的数据重新格式化,再将其作为参数重新提供给其它命令。

示例:

1. 将输入转换成一列参数

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

2. 单行输入转换成多行输出(-n)

tom@Ubuntu:$cat example.txt | xargs -n 2
1 2
3 4
5 6
7 8
9 10

3. 使用自定义定界符分隔参数(-d)

tom@Ubuntu:$echo "TomXisXaXboy." | xargs -d X
Tom is a boy.

4. 读取 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 #

5. 使用 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 这个定界符。