學(xué)習(xí)一個(gè) Linux 命令:xargs 命令
點(diǎn)擊上方“程序員大白”,選擇“星標(biāo)”公眾號(hào)
重磅干貨,第一時(shí)間送達(dá)
轉(zhuǎn)自:戀貓大鯉魚
https://dablelv.blog.csdn.net/article/details/5423387
1.命令簡(jiǎn)介
xargs 可以將 stdin 中以空格或換行符進(jìn)行分隔的數(shù)據(jù),形成以空格分隔的參數(shù)(arguments),傳遞給其他命令。因?yàn)橐钥崭褡鳛榉指舴?,所以有一些文件名或者其他意義的字符串內(nèi)含有空格的時(shí)候,xargs 可能會(huì)誤判。簡(jiǎn)單來說,xargs 的作用是給其他命令傳遞參數(shù),是構(gòu)建單行命令的重要組件之一。
之所以要用到 xargs,是因?yàn)楹芏嗝畈恢С质褂霉艿?| 來傳遞參數(shù),例如:
find /sbin -perm +700 | ls -l # 這個(gè)命令是錯(cuò)誤,因?yàn)闃?biāo)準(zhǔn)輸入不能作為ls的參數(shù)
find /sbin -perm +700 | xargs ls -l # 這樣才是正確的
2.命令格式
xargs [OPTIONS] [COMMAND]
3.選項(xiàng)說明
注意,長(zhǎng)選項(xiàng)的強(qiáng)制性參數(shù)對(duì)于短選項(xiàng)也是強(qiáng)制的。
-0, --null
如果輸入的 stdin 含有特殊字符,例如反引號(hào) `、反斜杠 \、空格等字符時(shí),xargs 將它還原成一般字符。為默認(rèn)選項(xiàng)
-a, --arg-file=FILE
從指定的文件 FILE 中讀取輸入內(nèi)容而不是從標(biāo)準(zhǔn)輸入
-d, --delimiter=DEL
指定 xargs 處理輸入內(nèi)容時(shí)的分隔符。xargs 處理輸入內(nèi)容默認(rèn)是按空格和換行符作為分隔符,輸出 arguments 時(shí)按空格分隔
-E EOF_STR
EOF_STR 是 end of file string,表示輸入的結(jié)束
-e, --eof[=EOF_STR]
作用等同于 -E 選項(xiàng),與 -E 選項(xiàng)不同時(shí),該選項(xiàng)不符合 POSIX 標(biāo)準(zhǔn)且 EOF_STR 不是強(qiáng)制的。如果沒有 EOF_STR 則表示輸入沒有結(jié)束符
-I REPLACE_STR
將 xargs 輸出的每一項(xiàng)參數(shù)單獨(dú)賦值給后面的命令,參數(shù)需要用指定的替代字符串 REPLACE_STR 代替。REPLACE_STR 可以使用 {} $ @ 等符號(hào),其主要作用是當(dāng) xargs command 后有多個(gè)參數(shù)時(shí),調(diào)整參數(shù)位置。例如備份以 txt 為后綴的文件:find . -name "*.txt" | xargs -I {} cp {} /tmp/{}.bak
-i, --replace[=REPLACE_STR]
作用同 -I 選項(xiàng),參數(shù) REPLACE_STR 是可選的,缺省為 {}。建議使用 -I 選項(xiàng),因?yàn)槠浞?POSIX
-L MAX_LINES
限定最大輸入行數(shù)。隱含了 -x 選項(xiàng)
-l, --max-lines[=MAX_LINES]
作用同 -L 選項(xiàng),參數(shù) MAX_LINES 是可選的,缺省為 1。建議使用 -L 選項(xiàng),因?yàn)槠浞?POSIX 標(biāo)準(zhǔn)
-n, --max-args=MAX_ARGS
表示命令在執(zhí)行的時(shí)候一次使用參數(shù)的最大個(gè)數(shù)
-o, --open-tty
在執(zhí)行命令之前,在子進(jìn)程中重新打開stdin作為/dev/TTY。如果您希望xargs運(yùn)行交互式應(yīng)用程序,這是非常有用的
-P, --max-procs=MAX_PROCS
每次運(yùn)行最大進(jìn)程;缺省值為 1。如果 MAX_PROCS 為 0,xargs 將一次運(yùn)行盡可能多的進(jìn)程。一般和 -n 或 -L 選項(xiàng)一起使用
-p, --interactive
當(dāng)每次執(zhí)行一個(gè) argument 的時(shí)候詢問一次用戶
--process-slot-var=NAME
將指定的環(huán)境變量設(shè)置為每個(gè)正在運(yùn)行的子進(jìn)程中的唯一值。一旦子進(jìn)程退出,將重用該值。例如,這可以用于初始負(fù)荷分配方案
-r, --no-run-if-empty
當(dāng) xargs 的輸入為空的時(shí)候則停止 xargs,不用再去執(zhí)行后面的命令了。為默認(rèn)選項(xiàng)
-s, --max-chars=MAX_CHARS
命令行的最大字符數(shù),指的是 xargs 后面那個(gè)命令的最大命令行字符數(shù),包括命令、空格和換行符。每個(gè)參數(shù)單獨(dú)傳入 xargs 后面的命令
--show-limits
顯示操作系統(tǒng)對(duì)命令行長(zhǎng)度的限制
-t, --verbose
先打印命令到標(biāo)準(zhǔn)錯(cuò)誤輸出,然后再執(zhí)行
-x, --exit
配合 -s 使用,當(dāng)命令行字符數(shù)大于 -s 指定的數(shù)值時(shí),退出 xargs
--help
顯示幫助信息并退出
--version
顯示版本信息并退出
4.常用示例
(1)將 Shell 的特殊字符反引號(hào)還原為一般字符。
echo '`0123`4 56789' | xargs -t echo
echo `0123`4 56789
`0123`4 56789
如果直接進(jìn)行如下操作,會(huì)報(bào)無法找到命令 01234 的錯(cuò)誤,因?yàn)榉匆?hào)在 Shell 中會(huì)將 01234 作為一個(gè)命令來執(zhí)行,但是 01234 不是一個(gè)命令。-t 表示先打印命令,然后再執(zhí)行。
echo `01234` 56789
-bash: 01234: command not found
56789
(2)設(shè)置 xargs 讀入?yún)?shù)時(shí)的結(jié)束標(biāo)識(shí),以逗號(hào)結(jié)束。這里要注意結(jié)束標(biāo)志必須要是單獨(dú)的字段,即以空格或者換行符分隔的字段。
echo 01234 , 56789 | xargs -E ","
01234
(3)使用 rm、mv 等命令同時(shí)操作多個(gè)文件時(shí),有時(shí)會(huì)報(bào) “argument list too long” 參數(shù)列表過長(zhǎng)的錯(cuò)誤,此時(shí)可以使用 xargs 來解決。xargs 將標(biāo)準(zhǔn)輸入的字符串分隔后,作為參數(shù)傳遞給后面的命令。例如,給當(dāng)前目錄的所有文件添加后綴名。
ls | xargs -t -i mv {} {}.bak
# 選擇符合條件的文件
ls | grep -E "201701|201702|201703" | xargs -I {} mv {} {}.bak
(4)設(shè)置命令行的最大字符數(shù)。參數(shù)默認(rèn)一個(gè)一個(gè)單獨(dú)傳入命令中執(zhí)行。
echo "01234 56789" | xargs -t -s 11
echo 01234
01234
echo 56789
56789
(5)設(shè)置標(biāo)準(zhǔn)輸入中每次多少行作為命令的參數(shù),默認(rèn)是將標(biāo)準(zhǔn)輸入中所有行的歸并到一行一次性傳給命令執(zhí)行。
echo -e "01234\n56789\n01234" | xargs -t -L 2 echo
echo 01234 56789
01234 56789
echo 01234
01234
(6)將文件內(nèi)容以空格分隔合并為一行輸出。
# 列出文件內(nèi)容
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 結(jié)合,強(qiáng)制終止指定進(jìn)程。
ps -ef | grep spp | awk '{printf "%s ",$2}' | xargs kill -9
ps \-ef|grep spp用于查找包含 spp 的進(jìn)程,awk '{printf "%s ",$2,FNR}將目標(biāo)進(jìn)程 ID 打印輸出,xargs kill \-9則將目標(biāo)進(jìn)程 ID 作為參數(shù)傳遞給kill \-9用于殺死進(jìn)程。
參考文獻(xiàn)
[1] xargs(1) manual
[2] CSDN.Xargs用法詳解
[3] CSDN.linux xargs詳解
推薦閱讀
國產(chǎn)小眾瀏覽器因屏蔽視頻廣告,被索賠100萬(后續(xù))
年輕人“不講武德”:因看黃片上癮,把網(wǎng)站和786名女主播起訴了
關(guān)于程序員大白
程序員大白是一群哈工大,東北大學(xué),西湖大學(xué)和上海交通大學(xué)的碩士博士運(yùn)營維護(hù)的號(hào),大家樂于分享高質(zhì)量文章,喜歡總結(jié)知識(shí),歡迎關(guān)注[程序員大白],大家一起學(xué)習(xí)進(jìn)步!


