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 '----'{}'---------'