您的位置:首页 > 运维架构 > Linux

Linux之玩转xargs

2016-05-01 11:56 316 查看

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 #
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: