1.命令簡介
xargs 可以將 stdin 中以空格或換行符進行分隔的數據,形成以空格分隔的參數(arguments),傳遞給其他命令。因為以空格作為分隔符,所以有一些文件名或者其他意義的字符串內含有空格的時候,xargs 可能會誤判。簡單來說,xargs 的作用是給其他命令傳遞參數,是構建單行命令的重要組件之一。
之所以要用到 xargs,是因為很多命令不支持使用管道 | 來傳遞參數,例如:
find /sbin -perm +700 | ls -l # 這個命令是錯誤,因為標準輸入不能作為ls的參數
find /sbin -perm +700 | xargs ls -l # 這樣才是正確的
2.命令格式
xargs [OPTIONS] [COMMAND]
3.選項說明
注意,長選項的強制性參數對于短選項也是強制的。
-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
顯示版本信息并退出
4.常用示例
(1)將 Shell 的特殊字符反引號還原為一般字符。
echo ‘`0123`4 56789’ | xargs -t echo
echo `0123`4 56789
`0123`4 56789
如果直接進行如下操作,會報無法找到命令 01234 的錯誤,因為反引號在 Shell 中會將 01234 作為一個命令來執行,但是 01234 不是一個命令。-t 表示先打印命令,然后再執行。
echo `01234` 56789
-bash: 01234: command not found
56789
(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
56789
01234” | 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
ps -ef|grep spp用于查找包含 spp 的進程,awk ‘{printf “%s ”,$2,FNR}將目標進程 ID 打印輸出,xargs kill -9則將目標進程 ID 作為參數傳遞給kill -9用于殺死進程。
原文標題:每天一個 Linux 命令(134):xargs 命令
文章出處:【微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。
責任編輯:haq
-
Linux
+關注
關注
87文章
11313瀏覽量
209754
原文標題:每天一個 Linux 命令(134):xargs 命令
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論