命令簡介
xargs可以將stdin中以空格或換行符進行分隔的資料,形成以空格分隔的引數(arguments),傳遞給其他命令。因為以空格作為分隔符,所以有一些檔名或者其他意義的字串內含有空格的時候,xargs可能會誤判。簡單來說,xargs的作用是給其他命令傳遞引數,是構建單行命令的重要元件之一。
之所以要用到xargs,是因為很多命令不支援使用管道|來傳遞引數,例如:
find /sbin -perm +700 | ls -l # 這個命令是錯誤,因為標準輸入不能作為ls的引數
find /sbin -perm +700 | xargs ls -l # 這樣才是正確的
命令格式
xargs [OPTIONS] [COMMAND]
選項說明
注意,長選項的強制性引數對於短選項也是強制的。
-0, --null
#如果輸入的stdin含有特殊字元,例如反引號 `、反斜槓 \、空格等字元時,xargs將它還原成一般字元。為預設選項
-a, --arg-file=FILE
#從指定的檔案FILE中讀取輸入內容而不是從標準輸入
-d, --delimiter=DEL
#指定xargs處理輸入內容時的分隔符。xargs處理輸入內容預設是按空格和換行符作為分隔符,輸出arguments時按空格分隔
-E EOF_STR
#EOF_STR是end of file string,表示輸入的結束
-e, --eof[=EOF_STR]
#作用等同於 -E 選項,與 -E 選項不同時,該選項不符合POSIX標準且EOF_STR不是強制的。如果沒有EOF_STR則表示輸入沒有結束符
-I REPLACE_STR
#將xargs輸出的每一項引數單獨賦值給後面的命令,引數需要用指定的替代字串REPLACE_STR代替。REPLACE_STR可以使用{} $ @ 等符號,其主要作用是當xargs command後有多個引數時,調整引數位置。
例如備份以 txt 為字尾的檔案:find . -name "*.txt" | xargs -I {} cp {} /tmp/{}.bak
-i, --replace[=REPLACE_STR]
#作用同 -I 選項,引數 REPLACE_STR 是可選的,預設為 {}。建議使用 -I 選項,因為其符合 POSIX
-L MAX_LINES
#限定最大輸入行數。隱含了 -x 選項
-l, --max-lines[=MAX_LINES]
#作用同 -L 選項,引數 MAX_LINES 是可選的,預設為 1。建議使用 -L 選項,因為其符合 POSIX 標準
-n, --max-args=MAX_ARGS
#表示命令在執行的時候一次使用引數的最大個數
-o, --open-tty
#在執行命令之前,在子程序中重新開啟stdin作為/dev/TTY。如果您希望xargs執行互動式應用程式,這是非常有用的
-P, --max-procs=MAX_PROCS
#每次執行最大程序;預設值為 1。如果MAX_PROCS為 0,xargs將一次執行儘可能多的程序。一般和-n或-L選項一起使用
-p, --interactive
#當每次執行一個argument的時候詢問一次使用者
--process-slot-var=NAME
#將指定的環境變數設定為每個正在執行的子程序中的唯一值。一旦子程序退出,將重用該值。例如,這可以用於初始負荷分配方案
-r, --no-run-if-empty
#當 xargs 的輸入為空的時候則停止xargs,不用再去執行後面的命令了。為預設選項
-s, --max-chars=MAX_CHARS
#命令列的最大字元數,指的是xargs後面那個命令的最大命令列字元數,包括命令、空格和換行符。每個引數單獨傳入xargs後面的命令
--show-limits
#顯示作業系統對命令列長度的限制
-t, --verbose
#先列印命令到標準錯誤輸出,然後再執行
-x, --exit
#配合 -s 使用,當命令列字元數大於 -s 指定的數值時,退出 xargs
--help
#顯示幫助資訊並退出
--version
#顯示版本資訊並退出
常用示例
1、將 Shell 的特殊字元反引號還原為一般字元。
echo '`0123`4 56789' | xargs -t echo
echo `0123`4 56789
`0123`4 56789
如果直接進行如下操作,會報無法找到命令 01234 的錯誤,因為反引號在 Shell 中會將 01234 作為一個命令來執行,但是 01234 不是一個命令。-t 表示先列印命令,然後再執行。值得收藏!Linux系統常用命令速查手冊
echo `01234` 56789
-bash: 01234: command not found
2、設定 xargs 讀入引數時的結束標識,以逗號結束。這裡要注意結束標誌必須要是單獨的欄位,即以空格或者換行符分隔的欄位。
echo 01234 , 56789 | xargs -E ","
01234
3、使用 rm、mv 等命令同時操作多個檔案時,有時會報 “argument list too long” 引數列表過長的錯誤,此時可以使用 xargs 來解決。xargs 將標準輸入的字串分隔後,作為引數傳遞給後面的命令。例如,給當前目錄的所有檔案新增字尾名。
ls | xargs -t -i mv {} {}.bak
# 選擇符合條件的檔案
ls | grep -E "201701|201702|201703" | xargs -I {} mv {} {}.bak
4、設定命令列的最大字元數。引數預設一個一個單獨傳入命令中執行。
echo "01234 56789" | xargs -t -s 11
echo 01234
01234
echo 56789
56789
5、設定標準輸入中每次多少行作為命令的引數,預設是將標準輸入中所有行的歸併到一行一次性傳給命令執行。
echo -e "01234\n56789\n01234" | xargs -t -L 2 echo
echo 01234 56789
01234 56789
echo 01234
01234
6、將檔案內容以空格分隔合併為一行輸出。
# 列出檔案內容
cat test.txt
a b c d e
f g h i j
k l m n o
# 多行輸入合併為一行輸出
cat test.txt | xargs
a b c d e f g h i j k l m n o
7、與ps、grep、awk和kill結合,強制終止指定程序。
ps -ef | grep spp | awk '{printf "%s ",$2}' | xargs kill -9
1
ps -ef|grep spp用於查詢包含 spp 的程序,awk '{printf "%s ",$2,FNR}將目標程序 ID 列印輸出,xargs kill -9則將目標程序 ID 作為引數傳遞給kill -9用於殺死程序。請收藏!Linux 運維必備的 40 個命令總結