知乎專欄 | 多維度架構 | 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者” |
xargs命令是 給其他命令傳遞參數的一個過濾器,也是組合多個命令的一個工具 它擅長將標準輸入數據轉換成命令行參數,xargs能夠處理管道或者stdin並將其轉換成特定命令的命令參數. xargs也可以將單行或多行文本輸入轉換為其他格式,例如多行變單行,單行變多行. xargs的預設命令是echo,空格是預設定界符;這意味着通過管道傳遞給xargs的輸入將會包含換行和空白,不過通過xargs的處理,換行和空白將被空格取代.
xargs命令用法
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
# 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
-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 \`@@\`;"
-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
-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
-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
-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*: 沒有那個檔案或目錄
-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