【shell】xargs用法说明

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

  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 '----'{}'---------'
posted @ 2020-02-10 22:45  OLIVER_QIN  阅读(1118)  评论(0编辑  收藏  举报