xargs命令

xargs命令緊跟在管道操作符之後,以標準輸入作爲主要的源數據流。其擅長將標準輸入數據轉化成命令行參數;也可以將單行或多行文本輸入,轉化爲其他格式(如單行變多行,多行變單行)。

xargs使用說明如下:
這裏寫圖片描述

1 格式化輸出
現有example.txt文件內容如下:

[root@middle-server tmp]# cat example.txt 
a b c d
e f g
h i
j

例1 將多行輸入轉換成單行輸出

[root@middle-server tmp]# cat example.txt | xargs
a b c d e f g h i j

說明:xargs默認的分隔符爲空格,通過將換行符用空格進行提換即可實現多行轉單行。

例2 將單行輸入轉換成多行輸出

[root@middle-server tmp]# cat example.txt | xargs -n 3
a b c
d e f
g h i
j

說明:-n用來指定每行最大參數數量,每個參數默認是有空格分隔開的字符串。

例3 按照指定分隔符分隔

[root@middle-server tmp]# echo "abc#def#ghi#jkl#" | xargs -d \# 
abc def ghi jkl 

[root@middle-server tmp]# echo "abcXdefXghiXjklX" | xargs -d X -n 2
abc def
ghi jkl

說明:如果不想使用默認的空格作爲分隔符,可以通過-d選項來指定作爲分隔符的字符。對於#這樣的特殊字符需要前加反斜線轉譯。

2 提供命令行參數
例4 將輸出直接追加到命令行後面作爲參數

[root@middle-server tmp]# echo "abcXdefXghiXjklX" | xargs -d X ./testCmd.sh 
abc def ghi jkl #
[root@middle-server tmp]# echo "abcXdefXghiXjklX" | xargs -d X -n 2 ./testCmd.sh 
abc def #
ghi jkl #
#

說明:當xargs轉換後的輸出格式爲多行時,這個命令會自行多次。

例5 按照固定格式提供命令行參數

[root@middle-server tmp]# echo "abcXdefXghiXjkl" | xargs -d X -I {} ./testCmd.sh -p {}  -f example.txt 
-p abc -f example.txt #
-p def -f example.txt #
-p ghi -f example.txt #
-p jkl -f example.txt #

說明:當需要按照固定格式傳遞參數時,可以用-I {}來實現。-I選項後面的{}代表的是每個參數,命令行參數部分的{}都會被從stdin讀取到的參數替換掉。
注意,當-I與xargs結合使用的時候,每個參數是以分隔符來劃分讀取的,格式化選項-n是不起作用的,如:

[root@middle-server tmp]# echo "abcXdefXghiXjkl" | xargs -d X -n 2 -I {} ./testCmd.sh -p {}  -f example.txt 
-p abc -f example.txt #
-p def -f example.txt #
-p ghi -f example.txt #
-p jkl -f example.txt #

例6 結合find使用xargs

[root@middle-server tmp]# find . -type f -name "*.txt" -print0 | xargs -0 ls -l 
-rw-r--r-- 1 root root 20 May 31 08:57 ./example.txt
-rw-r--r-- 1 root root  0 May 31 10:33 ./file1.txt
-rw-r--r-- 1 root root  0 May 31 10:33 ./file2.txt
-rw-r--r-- 1 root root  0 May 31 10:33 ./file3.txt
-rw-r--r-- 1 root root  0 May 31 10:33 ./file4.txt
-rw-r--r-- 1 root root  0 May 31 10:33 ./file5.txt

說明:使用find命令查找後綴爲.txt的文本文件,然後將結果經xargs傳給命令行。需要注意的是,find命令輸出的結果中的分隔符是無法預測的,有可能是’\n’換行或’ ‘空格,並且文件名中也可能包含空格。所以,這裏使用-print0以null(’\0’)來做分隔符。xargs通過-0來指定使用null作爲分隔符。

參考書籍:
Linux Shell 腳本攻略 (第二版)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章