Man xargs
通常我们学习一个命令的时候,我们肯定首先使用man xargs,官方给定的解释是
NAME
xargs - build and execute command lines from standard input
构建并且执行从标准输入(stdin)的命令行。
大家应该对管道不陌生吧。我们可以用管道将一个命令的stdout(标准输出)重定向到另一个命令的stdin(标准输入)。例如:
cat test.txt | grep "test"
但是,有些命令只能用命令行参数的形式接受数据,无法通过stdin接受数据流。在这种情况下,我们没法用管道来提供那些只有通过命令行参数才能提供的数据。
没有了管道,但是我们有xargs。xargs能够处理stdin并将其转换为特定命令的命令行参数。也可以将单行或多行文本输入转换成其他格式,例如单行变多行或者多行变单行。Bash黑客都喜欢单行命令。单行命令是一个命令序列,各命令之间不使用分号,而是使用管道操作符进行连接。精心编写的单行命令可以更高效,更简捷完成任务。就文本处理而言,需要具备扎实的理论和实践才能写出适合的单行命令解决方法。
怎么用?
xargs命令把stdin接收到的数据重新格式化,再将其作为参数给其他命令。
xargs可以作为一种替换方式,作用类似于find中的-exec参数。
多行输入变单行
只需要将换行符移除,再用” “进行代替就可以实现多行输入的转换。’\n’是一个换行符,换行符其实就是多行文本之间的定界符。利用xargs可以用空格替换掉’\n’。
cat example.txt
1 2 3 4 5
6 7 8
9 10
cat example.txt | xargs
1 2 3 4 5 6 7 8 9 10
单行变多行
我们可以利用-n 参数制定每行最大显示个数这样我们就可以划分为多行了。
cat example.txt | xargs -n 3
1 2 3
4 5 6
7 8 9
10
split切分
我们可以利用-d定制一个定界符,利用这个定界符进行切分。
echo "splitXsplitXsplitXsplit" | xargs -d X
split split split split
参数如何传递
在上面我们已经了解了xargs如何将stdin格式化不同的输出。现在我们把这些输出参数传递给命令。
1.读取stdin,将格式化参数传递给命令
文件名为:cecho.sh
#! /bin/bash
echo $* '#'
当参数被传递给cecho.sh,它会将这些参数打印出来,并以#字符作为结尾。例如:
./cecho.sh arg1 agr2
arg1 agr2 #
如果是一行一行的输入
./cecho.sh arg1
arg1 #
./cecho.sh arg2
arg2 #
如果我们这时有一个名为args.txt的参数列表文件我们这个时候可以使用xargs把参数导入这个命令。
cat args.txt | xargs ./cecho.sh
arg1 arg2 arg3 #
如果我们有些时候需要固定不变的参数,可以使用-I,-I可以制定一个字符串用于替换。
cat args.txt | xargs -n 1 -I {} ./cecho.sh -p {} -l
-p arg1 -l #
-p arg2 -l #
-p arg3 -l #