目录
1.xargs简介
在我们日常使用Linux的过程中,经常使用到管道命令,类似ps -ef |grep java
,该命令是查看Java进程的命令,其原理就是:将一个命令的标准输出(stdout)重新定向到另外一个命令的标准输入(stdin)。
但是,有时候我们有些特殊的操作,例如需要获取text.txt
文件的绝对路径:ls `pwd`/text.txt
,这种使用反引号执行命令的方式是最简单的。但是还有另外一种方法,那就是:pwd | xargs -I {} ls {}/test.txt
,这是一个简单的实用案例。
xargs的工作原理:该命令接收来自stdin的输入,并将其解析为单个元素,然后调用指令并将这些元素作为该命令的参数。xargs默认使用空白字符分割输入并执行/bin/echo
现有test.txt的文本内容如下:
2.默认echo
默认的echo参数会将多行输入转换成单行输出
[root@hdp-04 day10]# cat test.txt | xargs
a b c d e f g
3.-n选项
xargs的-n选项可以限制每次调用命令时候用到的参数个数。下面是将参数分割为多行,并且每行有M个元素
[root@hdp-04 day10]# cat test.txt | xargs -n 2
a b
c d
e f
g
4.-d选项
-d
选项用于自定义分隔符
[root@hdp-04 day10]# echo 'str1@str2@str3' | xargs -d '@'
str1 str2 str3
5.通过文件控制参数传入
现有如下两个文件:
[root@hdp-04 day10]# cat tryParam.sh
echo $* 'end;'
[root@hdp-04 day10]# cat param.txt
param1
param2
param3
param4
- 现在需要将param.txt中的参数逐个传给tryParam.sh文件并执行
[root@hdp-04 day10]# cat param.txt | xargs -n 1 sh tryParam.sh
param1 end;
param2 end;
param3 end;
param4 end;
- 现在需要将param.txt中的参数每次传2个给tryParam.sh文件并执行
[root@hdp-04 day10]# cat param.txt | xargs -n 2 sh tryParam.sh
param1 param2 end;
param3 param4 end;
3)将所有参数一次性传给tryParam.sh文件并执行
[root@hdp-04 day10]# cat param.txt | xargs sh tryParam.sh
param1 param2 param3 param4 end;
在上面的3个案例中,没有涉及到固定的参数,但是在实际使用的过程中,我们可能需要定义固定参数。
例如:在案例1中需要在每一次调度都需要添加一个-f参数
[root@hdp-04 day10]# cat param.txt | xargs -I {} sh tryParam.sh -f {}
-p param1 end;
-p param2 end;
-p param3 end;
-p param4 end;
使用-I参数的时候,命令以循环的方式执行,{}会在每次执行中被替换为相应的参数。
6.while子句的一个巧妙用法
[root@hdp-04 day10]# cat param.txt | (while read param;do echo '----'$param'---------';done)
----param1---------
----param2---------
----param3---------
----param4---------
# 上述语法等同于cat param.txt | xargs -I {} echo '----'{}'---------'
作者:奔跑的金鱼