目录



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的文本内容如下:

【shell】xargs用法说明_绝对路径

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


  1. 现在需要将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;


  1. 现在需要将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 '----'{}'---------'


作者:奔跑的金鱼