常用指令 – xargs

基本上常搭配其它linux指令 (find, awk, sed, grep…)一起使用,主要是因為一些linux的指令是沒直接支援pipe,所以可以透過xargs將前面pipe的輸出當成input arguments 給下一個指令使用;

xargs 後面沒有接任何的指令時,預設是以 echo 來進行輸出喔

將find的結果,透過xargs 來當作grep 主要要找的對象

find . -name "*.go" -print | xargs grep "src"

-0 flag

-0 flag主要是用來讓xargs 來讓可以去處理需要escape的字元,像是空白字元…

-n flag

-n flag 是用來指定每隔多少個要切割成一個pipe的arguments,也就是目前的pipe經過xargs以後會產生N/n 個pipe(N為目前pipe的argument數量)。如果沒有設定的話預設為把所有xargs 當下截取到的內容全部收集到目前這個pipe中。

舉例來說,一個env檔的內容如下:

FOO=123
BAR=456
LOCAL=127.0.0.1
PORT=3000

如果我們沒加-nflag時,用下面的指令:

cat env| xargs

則輸出結果會是 (env檔中的4個環境變數會被當成目前這個pipe的argument)

FOO=123 BAR=456 LOCAL=127.0.0.1 PORT=3000

但如果指令改成是下面這樣時

cat env| xargs -n 2

則輸出結果會是 (env檔的4個環境變數被切割成每2個是一組argument, 並且丟到下一個pipe中,所以這樣就fanout成2個pipe了)

FOO=123 BAR=456
LOCAL=127.0.0.1 PORT=3000

-I flag

-I 主要是可以用來將截取到的內容,暫存成一個變數名稱,來方便下個指令使用。

以下面的例子來說,會將所有找到的 *.conf檔案,透過xargs暫存到變數{}中,所以接下來的ls -al {}就可以這樣用…

find /etc/ -name "*.conf" | xargs -I{} ls -al {}

另個例子則是像是備份所有的.conf檔,則可以透過-I flag

find /etc/ -name "*.conf" | xargs -I{} cp {} {}.bk

integrate with bash

更彈性的用法是,它可以直接當作bash的輸入arguments;若一樣以前面的env 檔來當例子,透過以下指令我們可以透過一個簡短的bash來處理其中的第3個($2)環境變數。

cat env| xargs bash -c 'export $2'

Reference: