Linux命令 xargs

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

一、对接收到的数据进行格式化

1、将多行输入转换成单行输出

[zhuwan@client01 linux]$ cat example.txt
1 2 3 4 5 6
7 8 9 10
11 12
[zhuwan@client01 linux]$ cat example.txt | xargs
1 2 3 4 5 6 7 8 9 10 11 12

2、将单行输入转换成多行输出,将任何来自stdin的文本划分成多行,每行n个参数,空格为默认定界符

[zhuwan@client01 linux]$ cat example.txt | xargs -n 3

1 2 3
4 5 6
7 8 9
10 11 12

3、-d选项为输入指定一个定制的定界符,默认输入定界符为空格

[zhuwan@client01 linux]$ echo "splitXsplitXsplit" | xargs -d X
split split split
[zhuwan@client01 linux]$ echo "splitXsplitXsplit" | xargs -d X -n 2
split split
split

二、将格式化参数传递给命令

1、编写一个定制版echo来更好地演示xargs提供命令行参数的方法

[zhuwan@client01 xargs]$ cat cecho.sh
#!/bin/bash
#filename:cecho.sh

echo $*'#'
[zhuwan@client01 xargs]$ ./cecho.sh arg1 arg2
arg1 arg2#
当参数被传递给文件cecho.sh后,它会将这些参数打印出来,并以#结尾
思考这样一个问题:有一个包含参数列表的文件,需要将这些参数传递给一个命令(如cecho.sh),每次需要提供1个参数或2个参数或全部参数,使用xargs可以解决这个问题
1.1、传递一个参数
[zhuwan@client01 xargs]$ cat args.txt | xargs -n 1 ./cecho.sh
arg1#
arg2#
arg3#
1.2、传递两个参数
[zhuwan@client01 xargs]$ cat args.txt | xargs -n 2 ./cecho.sh
arg1 arg2#
arg3#
1.3、传递所有参数
[zhuwan@client01 xargs]$ cat args.txt | xargs ./cecho.sh
arg1 arg2 arg3#

再思考这样一个问题:我们除了文件中的参数外,还需要一些固定不变的命令参数,格式为 ./cecho.sh -p arg1 -l

xargs有一个 -I 选项, -I 可以指定替换字符串,这个字符串在xargs扩展时会被替换掉,需要注意的是, -I 参数使用时,命令会循环执行每一行参数,-n参数将会失效

[zhuwan@client01 xargs]$ cat args.txt | xargs -I {} ./cecho.sh -p {} -l
-p arg1 -l#
-p arg2 -l#
-p arg3 -l#

2、xargs和find是一对死党,但使用过程中,如下的做法要注意,有可能会删除不必要删除的文件,若文件中包含空格符,xargs很可能会将它认定为定界符

find . -type f -name "*.txt" -print | xargs rm -f

举例如下:“he test.txt”中包含空格符,xargs将此空格符当做了定界符,传递给后面的命令是无法找到文件“he test.txt”

[zhuwan@client01 xargs]$ find . -type f -name "*.txt" -print
./example.txt
./args.txt
./args2.txt
./he.txt
./he test.txt

[zhuwan@client01 xargs]$ find . -type f -name "*.txt" | xargs ls -l
ls: cannot access ./he: No such file or directory
ls: cannot access test.txt: No such file or directory
-rw-rw-r--. 1 zhuwan zhuwan 30 Dec 16 01:24 ./args2.txt
-rw-rw-r--. 1 zhuwan zhuwan 15 Dec 16 01:23 ./args.txt
-rw-rw-r--. 1 zhuwan zhuwan 27 Dec 16 01:03 ./example.txt
-rw-rw-r--. 1 zhuwan zhuwan 0 Dec 16 01:40 ./he.txt

为了避免上述问题,就必须将-print0和find结合使用,以字符null('\0')来分隔输出

[zhuwan@client01 xargs]$ find . -type f -name "*.txt" -print0 | xargs -0 ls -l
-rw-rw-r--. 1 zhuwan zhuwan 30 Dec 16 01:24 ./args2.txt
-rw-rw-r--. 1 zhuwan zhuwan 15 Dec 16 01:23 ./args.txt
-rw-rw-r--. 1 zhuwan zhuwan 27 Dec 16 01:03 ./example.txt
-rw-rw-r--. 1 zhuwan zhuwan 0 Dec 16 01:40 ./he test.txt
-rw-rw-r--. 1 zhuwan zhuwan 0 Dec 16 01:40 ./he.txt

posted @ 2017-12-15 17:51  pigwan7  阅读(222)  评论(0编辑  收藏  举报