xargs命令原理

學(xué)習(xí)linux命令除了要學(xué)會(huì)查看幫忙手冊(cè)外,另外一點(diǎn)就是最好能明白命令存在的理由,即命令主要用于解決什么問(wèn)題?那么xargs是為了解決什么問(wèn)題呢?

直接劃重點(diǎn):xargs命令的作用是將標(biāo)準(zhǔn)輸入轉(zhuǎn)化成命令行參數(shù)。我們知道,在linux系統(tǒng)下,有些命令可以除了可以指定參數(shù)外,還可以將標(biāo)準(zhǔn)輸入作為命令參數(shù),如grep、awk、cat;而有些命令則只指定參數(shù),不能將標(biāo)準(zhǔn)輸入作為參數(shù),如cp、mv。在實(shí)際使用命令過(guò)程中,我們經(jīng)常用管道將兩個(gè)(或多個(gè))命令連接起來(lái),而管理的作用是將上一個(gè)命令的標(biāo)準(zhǔn)輸出作為下一個(gè)命令的標(biāo)準(zhǔn)輸入。而xargs的作用就是將上一個(gè)命令產(chǎn)生的標(biāo)準(zhǔn)輸出轉(zhuǎn)化為下一個(gè)命令的輸入?yún)?shù)。

如果還是不太明白,我們來(lái)看一個(gè)例子:

shell> cat arg.txt
arg1
arg2
arg3
shell> echo 'arg.txt' | cat
arg.txt
shell> echo 'arg.txt' | xargs cat
arg1
arg2
arg3

cat命令即能接入標(biāo)準(zhǔn)輸入,也能接受輸入?yún)?shù),當(dāng)執(zhí)行 echo 'arg.txt' | cat 實(shí)際上是將echo命令的輸出(arg.txt)作為cat的標(biāo)準(zhǔn)輸入,cat只是將標(biāo)準(zhǔn)輸入的內(nèi)容(arg.txt)打印出來(lái)而且;而第二個(gè)命令echo 'arg.txt' | xargs cat xargs將標(biāo)準(zhǔn)輸入轉(zhuǎn)化為cat的輸入?yún)?shù),故cat輸出arg.txt文件的內(nèi)容。

基本語(yǔ)法

xargs一般是和管道一起使用,如下:

command | xargs [options] [command]

以下只列舉一些常用參數(shù)如下,詳細(xì)參數(shù)請(qǐng)使用man xargs查看:

  • -L num
    在標(biāo)準(zhǔn)輸入中一次最多讀取num行給命令,如果num未指定,默認(rèn)為1,如:
shell> echo -e "1\n2\n3\n4\n5" | xargs -L 2
1 2
3 4
5

上例中管道后面沒(méi)有指定命令,xargs默認(rèn)執(zhí)行echo,相當(dāng)于echo -e "1\n2\n3\n4\n5" | xargs -L 2 echo.

  • -n num
    表示命令在執(zhí)行的時(shí)候一次最多用的參數(shù)個(gè)數(shù),默認(rèn)是用所有的,如:
shell> echo {0..9} | xargs -n 3 echo
0 1 2
3 4 5
6 7 8
9

一共有0到9十個(gè)參數(shù),每次傳最多傳3個(gè)參數(shù)給管道后面的echo命令。

  • -d delim
    指定參數(shù)的分隔符,如:
shell> echo '1#2#3\0' | xargs -d '#' echo
1 2 3
  • -I replace-str
    參數(shù)替換符,對(duì)于管道后面的命令接收的參數(shù)可能不止一個(gè),這個(gè)時(shí)候我們可以通過(guò)-I參數(shù)在指定位置替換成相應(yīng)參數(shù),如在將當(dāng)前目錄下所有后綴為.txt的文件進(jìn)行備份:
shell> find . -type f -name '*.txt' | xargs -I {} mv {} {}.bak
  • -0 或 --null
    這個(gè)參數(shù)通過(guò)跟find命令結(jié)合使用,當(dāng)文件名中包括空格時(shí),我們通過(guò)會(huì)使用find命令的-print0進(jìn)行輸出,輸出時(shí)會(huì)在每行后面加一個(gè)\0,如果要將find命令的輸出作用命令的參數(shù)時(shí),這個(gè)時(shí)候我們可以使用-0--null參數(shù)進(jìn)行分割。假設(shè)我們要?jiǎng)h除/tmp目錄下名為'a b c.txt'的文件,如下:
shell> find /tmp -type f -name 'a b c.txt' -print0 | xargs -0 rm -f
  • -p
    當(dāng)每次執(zhí)行一個(gè)參數(shù)的時(shí)候詢問(wèn)一次用戶,可以通過(guò)該命令查看每傳傳給管道后面的命令是否是期望的參數(shù),如:
shell> echo {0..9} | xargs -n 3 -p echo
echo 0 1 2 ?...
echo 3 4 5 ?...
echo 6 7 8 ?...
echo 9 ?...

常見(jiàn)用法示例

  • 刪除指定目錄下后續(xù)為.log的日志文件
shell> find . -type f -name "*.log" -print0 | xargs -0 rm -f
  • 殺掉指定進(jìn)程
shell> ps -ef | grep nginx | awk '{print $2}' | xargs kill -9
  • 統(tǒng)計(jì)源代碼目錄中所有 php 文件的行數(shù)
shell> find . -type f -name "*.php" -print0 | xargs -0 wc -l

--- 完 ---

參考

[1] https://en.wikipedia.org/wiki/Xargs
[2] http://www.tutorialspoint.com/unix_commands/xargs.htm

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容