Home | 簡體中文 | 繁體中文 | 雜文 | 知乎專欄 | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 視頻教程 | 打賞(Donations) | About
知乎專欄多維度架構 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者”

26.13. standard input/output

26.13.1. xargs - build and execute command lines from standard input

xargs命令是 給其他命令傳遞參數的一個過濾器,也是組合多個命令的一個工具 它擅長將標準輸入數據轉換成命令行參數,xargs能夠處理管道或者stdin並將其轉換成特定命令的命令參數. xargs也可以將單行或多行文本輸入轉換為其他格式,例如多行變單行,單行變多行. xargs的預設命令是echo,空格是預設定界符;這意味着通過管道傳遞給xargs的輸入將會包含換行和空白,不過通過xargs的處理,換行和空白將被空格取代.

xargs命令用法

26.13.1.1. 格式化

xargs用作替換工具,讀取輸入數據重新格式化後輸出。

			
定義一個測試檔案,內有多行文本數據:

cat >> test.txt <<EOF

a b c d e f g
h i j k l m n
o p q
r s t
u v w x y z

EOF

# cat test.txt 

a b c d e f g
h i j k l m n
o p q
r s t
u v w x y z


多行輸入一行輸出:

# cat test.txt | xargs
a b c d e f g h i j k l m n o p q r s t u v w x y z

等效
# cat test.txt | tr "\n" " "
a b c d e f g h i j k l m n o p q r s t u v w x y z
			
			

26.13.1.2. standard input

			
# xargs < test.txt 
a b c d e f g h i j k l m n o p q r s t u v w x y z		
		
# cat /etc/passwd | cut -d : -f1 > users
# xargs -n1 < users echo "Your name is"
Your name is root
Your name is bin
Your name is daemon
Your name is adm
Your name is lp
Your name is sync
Your name is shutdown
Your name is halt
Your name is mail
Your name is operator
Your name is games
Your name is ftp
Your name is nobody
Your name is dbus
Your name is polkitd
Your name is avahi
Your name is avahi-autoipd
Your name is postfix
Your name is sshd
Your name is neo
Your name is ntp
Your name is opendkim
Your name is netkiller
Your name is tcpdump		
			
			

26.13.1.3. -I 替換操作

-I R same as --replace=R

複製所有圖片檔案到 /data/images 目錄下:

ls *.jpg | xargs -n1 -I cp {} /data/images
			
			
讀取stdin,將格式化後的參數傳遞給命令xargs的一個選項-I,使用-I指定一個替換字元串{},這個字元串在xargs擴展時會被替換掉,當-I與xargs結合使用,每一個參數命令都會被執行一次:

# echo "name=Neo|age=30|sex=T|birthday=1980" | xargs -d"|" -n1 | xargs -I {} echo "select * from tab where {} "
select * from tab where name=Neo 
select * from tab where age=30 
select * from tab where sex=T 
select * from tab where birthday=1980 

# xargs -I user echo "Hello user" <users 
Hello root
Hello bin
Hello daemon
Hello adm
Hello lp
Hello sync
Hello shutdown
Hello halt
Hello mail
Hello operator
Hello games
Hello ftp
Hello nobody
Hello dbus
Hello polkitd
Hello avahi
Hello avahi-autoipd
Hello postfix
Hello sshd
Hello netkiller
Hello neo
Hello tss
Hello ntp
Hello opendkim
Hello noreply
Hello tcpdump
			
			
-I 使用-I指定一個替換字元串,這個字元串在xargs擴展時會被替換掉,當-I與xargs結合使用,每一個參數命令都會被執行一次.
mysql -u root -predhat -s -e "show databases" | egrep "^mt4_user_equity_" | xargs -I "@@" mysql -u root -predhat -e "DROP DATABASE \`@@\`;"  			
			

26.13.1.4. -n, --max-args=MAX-ARGS use at most MAX-ARGS arguments per command line

-n 參數來指定每一次執行指令所使用的參數個數上限值.

			
-n選項多行輸出:

# cat test.txt | xargs -n3
a b c
d e f
g h i
j k l
m n o
p q r
s t u
v w x
y z
# cat test.txt | xargs -n4
a b c d
e f g h
i j k l
m n o p
q r s t
u v w x
y z
# cat test.txt | xargs -n5
a b c d e
f g h i j
k l m n o
p q r s t
u v w x y
z

[neo@netkiller test]# echo 'a b c d e 1 2 3 4 5' | xargs -n 5
a b c d e
1 2 3 4 5
			
			

26.13.1.5. -t, --verbose print commands before executing them

-t 參數可以讓 xargs 在執行指令之前先顯示要執行的指令

			
[neo@netkiller test]# echo a b c d e f | xargs -t
/bin/echo a b c d e f
a b c d e f
			
			

26.13.1.6. -d, --delimiter=CHARACTER items in input stream are separated by CHARACTER, not by whitespace; disables quote and backslash processing and logical EOF processing

-d 自定義一個定界符 預設是空格

			
[neo@netkiller test]# echo 'abc' | xargs -d b
a c

-d選項可以自定義一個定界符:

# echo "name|age|sex|birthday" | xargs -d"|"
name age sex birthday

結合-n選項使用:

# echo "name=Neo|age=30|sex=T|birthday=1980" | xargs -d"|" -n1
name=Neo
age=30
sex=T
birthday=1980	
			
			

26.13.1.7. -0, --null items are separated by a null, not whitespace; disables quote and backslash processing and logical EOF processing

-0 是以null字元結尾的,而不是以白空格(whitespace)結尾的且引號和反斜杠,都不是特殊字元;

			

每個輸入的字元,都視為普通字元禁止掉檔案結束符,被視為別的參數.當輸入項可能包含白空格,引號,反斜杠等情況時,才適合用此參數
[neo@netkiller test]# touch "Mr liu"
[neo@netkiller test]# ls M*
Mr liu
[neo@netkiller test]# find -type f -name "Mr*" | xargs rm -f
[neo@netkiller test]# ls M*
Mr liu
[neo@netkiller test]# find -type f -name "Mr*" | xargs -t rm  -f
rm -f ./Mr liu
// 這個時候我們可以將 find 指令加上 -print0 參數,另外將 xargs 指令加上 -0 參數,改成這樣:
[neo@netkiller test]# find -type f -name "Mr*"  -print0| xargs -t -0 rm  -f
rm -f ./Mr liu
[neo@netkiller test]# ls M*
ls: 無法訪問M*: 沒有那個檔案或目錄			
			
			

26.13.1.8. -r, --no-run-if-empty if there are no arguments, then do not run COMMAND; if this option is not given, COMMAND will be

-r 如果標準輸入不包含任何非空格,請不要運行該命令.

			
[neo@netkiller test]# echo a b c d e f | xargs -p -n 3
/bin/echo a b c ?...n
/bin/echo d e f ?...n
/bin/echo ?...n
//當我們使用 -p 參數時,如果所有的指令都輸入 n 跳過不執行時候,最後還會出現一個沒有任何參數的 echo 指令,
如果想要避免以這種空字串作為參數來執行指令,可以加上 -r 參數
[neo@netkiller test]# echo a b c d e f | xargs -p -n 3 -r
/bin/echo a b c ?...n
/bin/echo d e f ?...n
			
			

26.13.1.9. -p, --interactive prompt before running commands

-p 確認操作選項,具有可交互性:

-P 修改最大的進程數, 預設是1.為 0 時候為 as many as it can.