Linux那點(diǎn)事-xargs命令詳解

Linux xargs 命令
xargs原理剖析及用法詳解

1. 為什么需要xargs命令

1.1 管道|的缺陷

管道實(shí)現(xiàn)的是將前面的輸出stdout作為后面的輸入stdin照皆,但是有些命令不接受管道的傳遞方式恨旱。例如:ls模她,這是為什么呢?因?yàn)橛行┟钕M艿纻鬟f過(guò)來(lái)的是參數(shù),但是直接使用管道有時(shí)無(wú)法傳遞到命令的參數(shù)位乖篷。這時(shí)候就需要xargs凉蜂,xargs實(shí)現(xiàn)的是將管道傳遞過(guò)來(lái)的stdin進(jìn)行處理然后傳遞到命令的參數(shù)位置上。

用戶查找文件:

查找文件

用戶希望處理查找后的文件:

管道的缺陷

也就是xargs完成了兩個(gè)行為:

1. 處理管道傳輸過(guò)來(lái)的stdin羔杨;
2. 將處理后的數(shù)據(jù)傳遞到正確的位置捌臊;

1.2 xargs對(duì)數(shù)據(jù)的處理

處理大量數(shù)據(jù)的時(shí)候,可能會(huì)發(fā)生參數(shù)列表過(guò)長(zhǎng)的情況问畅。而xargs將完成參數(shù)的定位我們清楚娃属,但是xrags如何處理管道傳輸?shù)?strong>stdin呢六荒?

其實(shí)就是完成兩個(gè)操作:

1. 對(duì)數(shù)據(jù)的分割;
2. 對(duì)數(shù)據(jù)的分批矾端;

xargs處理的優(yōu)先級(jí)或順序:先分割掏击,在分批,然后傳遞到參數(shù)位秩铆。

可以設(shè)想一個(gè)場(chǎng)景砚亭,我想對(duì)一堆數(shù)據(jù)進(jìn)行處理,實(shí)際上是對(duì)一堆中的每個(gè)數(shù)據(jù)進(jìn)行分別的處理殴玛。那么如何將一堆數(shù)據(jù)按照自定義規(guī)則分割為獨(dú)立的數(shù)據(jù)捅膘?若是一次性傳遞的數(shù)據(jù)過(guò)多,又該如何處理滚粟?

1.2.1 xrags的并發(fā)處理

但需要注意的是寻仗,盡管實(shí)現(xiàn)了分批處理,但是默認(rèn)情況下并沒(méi)有提高任何效率凡壤,因?yàn)榉峙鷤鬟f之后還是一次執(zhí)行一個(gè)署尤。而且有時(shí)候分批之后是將其作為一個(gè)參數(shù)的整體,并不會(huì)將分批中的信息分段執(zhí)行亚侠。

但事實(shí)上曹体,xargs提高了-P選項(xiàng),用于指定并發(fā)執(zhí)行的數(shù)量(默認(rèn)是只要一個(gè)處理進(jìn)程硝烂,不會(huì)提供效率箕别,但是可以指定為N個(gè)子進(jìn)程,或者指定為0表示盡可能多的利用CPU)滞谢。這樣就能將讓分批操作更好的利用多核CPU串稀,從而提升效率。例如上面分成了兩批狮杨,指定-P 2可以并發(fā)執(zhí)行兩批厨诸,而并非執(zhí)行完第一批之后再執(zhí)行第二批。

剩下的功能就是處理xargs的細(xì)節(jié)問(wèn)題了禾酱,比如如何分割(xargs微酬、xargs -d、xargs -0)颤陶,分割后如何劃批(xargs -n颗管、xargs -L),參數(shù)如何傳遞(xargs -i)滓走。另外xargs還提供了詢問(wèn)交互處理(-p選項(xiàng))和預(yù)先打印一遍命令執(zhí)行情況(-t選項(xiàng))垦江,傳遞終止符(-E選項(xiàng))等。

1.2.2 執(zhí)行命令準(zhǔn)備

命令準(zhǔn)備:

[root@xuexi tmp]$ cd /tmp
[root@xuexi tmp]$ rm -fr *
[root@xuexi tmp]$ mkdir a b c d test logdir shdir
[root@xuexi tmp]$ touch "one space.log"
[root@xuexi tmp]$ touch logdir/{1..10}.log
[root@xuexi tmp]$ touch shdir/{1..5}.sh
[root@xuexi tmp]$ echo "the second sh the second line" > shdir/2.sh 
[root@xuexi tmp]$ cat <<eof>shdir/1.sh  
> the first sh
> the second line
> eof

1.2.3 Linux空格含義

那么按照什么規(guī)則進(jìn)行“分割”以及“分批”呢搅方?

Linux文件空格分類(lèi)(重點(diǎn)):

換行符比吭、制表符绽族、空格符

  • 正方形(\t)代表:(標(biāo)記意義)制表符;
  • 圓形(空格)代表:(文本意義)普通空格衩藤;
  • 長(zhǎng)方形(\n)代表:(標(biāo)記意義)換行符吧慢;
文本意義換行符和標(biāo)記意義換行符
  • 橢圓形代表:(文本意義)換行符;
  • 長(zhǎng)方形代表:(標(biāo)記意義)換行符赏表;

2. xrags的分割行為

xargs命令會(huì)將接收的stdin所有的空白(空格检诗、制表符、換行符)都轉(zhuǎn)換為空格瓢剿。我們使用xargs -d "xx"自定義規(guī)則對(duì)數(shù)據(jù)進(jìn)行切分逢慌。默認(rèn)情況下,xargs使用空格來(lái)切分?jǐn)?shù)據(jù)间狂。

注意事項(xiàng)

  • xargs -d可以指定分割符攻泼,可以是單個(gè)符號(hào)、字母或者數(shù)字鉴象。如指定o為分割符:xargs -d "o"坠韩;
  • xargs -d是分割階段的選項(xiàng),所以會(huì)優(yōu)先于分批選項(xiàng)(-n炼列、-L、-i)
  • xargs -d不是先xargs-d處理的音比,它是區(qū)別于獨(dú)立的xargs的另外一個(gè)分割選項(xiàng)俭尖。

1. xargs -d原理

  • 替換:將接收stdin所有的【標(biāo)記意義】的符號(hào)替換為\n,替換完成后所有的符號(hào)(空格洞翩、制表符稽犁、分行符)變成【文本意義】上的普通符號(hào)。

  • 分段:根據(jù)-d指定的分隔符進(jìn)行分段骚亿,并用空格分開(kāi)每段已亥,由于發(fā)生了【替換】操作,所以符號(hào)都是【文本意義】上的来屠。會(huì)導(dǎo)致分段中可能包含了空格虑椎、制表符、分行符俱笛。也就是說(shuō)處了-d導(dǎo)致的【分段空格】捆姜,其余所有符號(hào)都是分段中的一部分。

  • 輸出:最后根據(jù)指定的【分批選項(xiàng)】來(lái)輸出迎膜。

2. 案例分析

默認(rèn)情況下泥技,使用空格進(jìn)行分割,但若是指定自定義分割符(此處使用o)磕仅,那么將o替換為分段空格后珊豹,切分獨(dú)立整體簸呈。

使用-d分段

xargs -d "o"進(jìn)行自定義分割后,然后分批店茶,我們可以看到蜕便,實(shí)際上分成了2批。

使用-n查看-d的分批情況

3. xrags -0命令

xargs -0的行為和xargs -d基本一樣忽妒,只是-d是指定分割符玩裙,-0是指定固定的\0作為分割符。等價(jià)于xargs -d "\0"段直。

(注意)xargs -0 可以處理接收到的stdin中的null字符(\0)吃溅。如果不使用-0選項(xiàng)或-null選項(xiàng),檢測(cè)到\0后會(huì)給出警告提醒鸯檬,并只向命令傳遞非\0段决侈。

tr命令:替換或者刪除字符】

\0的作用

4. 實(shí)際應(yīng)用:
-xargs -0的包含空格的文件的操作。

【起因】使用find+rm命令無(wú)法刪除帶有空格的文件喧务。

xargs命令輸出

【原因】:xargs默認(rèn)是以空白字符(空格赖歌、換行符、制表符)來(lái)分割記錄的功茴,實(shí)際上rm刪除的數(shù)據(jù)便是./onefile.txt庐冯。

【解決方案】:此時(shí)我們不能使用默認(rèn)的分割符,而應(yīng)該使用自定義的分割符坎穿!我們知道find命令展父,文件后面均是換行符

find命令

【解決方案】為了解決這個(gè)問(wèn)題玲昧,可以在每個(gè)文件將換行符替換為NULL(\0)栖茉。這樣我們以\0分割,就可以得到完整文件孵延。

xargs -0分段

為什么要使用\0作為分割符吕漂,而不是其他字符呢?因?yàn)樵诰幊陶Z(yǔ)言中尘应,一般使用\0作為結(jié)束標(biāo)志惶凝。而文件的路徑名不可能包含\0

本質(zhì)上是借助xargs的對(duì)\0的分割操作犬钢。find命令將換行符替換成\0梨睁。

3. xargs的分批行為

對(duì)于xargs,不寫(xiě)命令時(shí)默認(rèn)的執(zhí)行是echo娜饵。

默認(rèn)xargs命令將換行處理掉了

將換行處理掉不是echo實(shí)現(xiàn)的坡贺,而是管道傳遞過(guò)來(lái)的stdin經(jīng)過(guò)xargs處理后得到的。將所有【文本/標(biāo)記意義】空格、制表符和分行符都替換為【文本意義】上空格并壓縮到一行顯示遍坟。

【注意】這一整行將作為一個(gè)整體拳亿。這個(gè)整體可能直接交給命令或者作為stdout通過(guò)管道傳遞給管道右邊的命令,這時(shí)結(jié)果將作為一個(gè)整體傳遞愿伴,也有可能被xargs同時(shí)指定的【分批選項(xiàng)】分批處理肺魁。(這也是可能出現(xiàn)參數(shù)列表過(guò)長(zhǎng)的原因)

xargs分批命令總結(jié):

  • xargs -n :和獨(dú)立的xargs命令配合使用時(shí),按照默認(rèn)分割符(空格)進(jìn)行分批隔节,但配合x(chóng)args -d命令鹅经,則按自定義分割符分批。

  • xargs -L-n選項(xiàng)類(lèi)似,唯一的區(qū)別就是-L永遠(yuǎn)是按段劃批,而-n和獨(dú)立的xargs一起使用時(shí)是按空格分段劃批的丧裁。

2. 對(duì)獨(dú)立的xargs指定分批選項(xiàng)

  • 【標(biāo)記/文本】指定-n時(shí)按空格分段壶栋,然后劃批埠啃,不管是文本意義空格還是標(biāo)記意義的空格,只要是空格都是-n的操作對(duì)象。

  • 【標(biāo)記】指定-L或者-i時(shí)按段劃批,文本意義的符號(hào)不被處理强胰。

【需要注意的是】:【xargs -n】本質(zhì)上分為兩種情況:

  1. 和獨(dú)立的xargs一起使用,這時(shí)按照每個(gè)空格分段劃批妹沙;
  2. xargs -dxargs -0一起使用偶洋,這時(shí)按段分批;
  3. xargs -L-n選項(xiàng)類(lèi)似距糖,唯一的區(qū)別就是-L永遠(yuǎn)是按段劃批玄窝,而-n和獨(dú)立的xargs一起使用時(shí)是按空格分段劃批的。
-n和-L的區(qū)別
-i也不會(huì)分割文本意義的空格

4 xargs -i 接收傳遞的分批結(jié)果

xargs -i選項(xiàng)在邏輯上用于接收傳遞的分批結(jié)果肾筐。

如果不使用-i,則默認(rèn)是將分割處理后的結(jié)果整體傳遞到【命令的最尾部】缸剪。但是有時(shí)候需要傳遞到多個(gè)位置吗铐,不使用-i就不知道傳遞到哪個(gè)位置了。

例如:重命名備份的時(shí)候在每個(gè)傳遞過(guò)來(lái)的文件名加上后綴.bak杏节,這需要兩個(gè)參數(shù)位唬渗。

語(yǔ)法:
使用xargs -i時(shí)以大括號(hào){}作為替換符號(hào),傳遞的時(shí)候看到{}就將結(jié)果替換奋渔,可以將{}放在任意需要傳遞的參數(shù)位置上镊逝。如果多個(gè)地方使用{}就實(shí)現(xiàn)了多個(gè)傳遞。

xargs -Ixargs -i是一樣的嫉鲸,只是-i默認(rèn)使用大括號(hào)作為替換符號(hào)撑蒜,-I可以指定其他符號(hào)、字母、數(shù)字作為替換符號(hào)座菠,但是必須用引號(hào)包起來(lái)狸眼。man推薦使用-I代替-i,但是一般使用-i方便浴滴,除非在命令中不能使用{}拓萌,例如touch {1...10}.log時(shí),大括號(hào)就不能用來(lái)做替換符號(hào)升略。

分析:重命名備份的時(shí)候在每個(gè)傳遞過(guò)來(lái)的文件名加上后綴.bak微王。

案例分析1:

./指的是當(dāng)前目錄】

  1. 重命名邏輯是:mv ./logdir/a.log ./logdir/a.log.bak
  2. 我們想將一個(gè)目錄下的文件都要執(zhí)行某些邏輯。

命令:ls logdir/ | xargs -i mv ./logdir/{} ./logdir/{}.bak

為什么將“-i”選項(xiàng)劃分在分批選項(xiàng)里面品嚣,因?yàn)樗J(rèn)一個(gè)段就是一個(gè)批炕倘,每次傳遞一個(gè)批就是傳遞一個(gè)段到指定大括號(hào){}位上。不理解腰根,可以看下1.2.4 分批選項(xiàng)的生效規(guī)則

xargs的-i字段的使用

案例分析2:

例如:想將數(shù)字1-10沒(méi)三個(gè)數(shù)顯示在startend之間激才。

start 1 2 3 end 
start 4 5 6 end 
start 7 8 9 end 
start 10 end 

由于指定了參數(shù)傳遞位置,所以必須使用-i额嘿,那就無(wú)法一次傳遞3個(gè)數(shù)瘸恼,要解決這個(gè)問(wèn)題,就要想辦法讓每三個(gè)樹(shù)分一次段册养,然后后使用-i傳遞东帅,那么可以將每三個(gè)數(shù)分一次行寫(xiě)入一個(gè)文件。
例如:

xargs -i分段操作

當(dāng)然球拦,也可以多次使用xargs靠闭。在很多使用無(wú)法解決分段的問(wèn)題都可以通過(guò)多次使用xargs來(lái)解決。

多次使用xargs命令進(jìn)行分段

5. 分批選項(xiàng)的生效規(guī)則

-i坎炼、-L愧膀、-n選項(xiàng)都是分批選項(xiàng),他們的生效規(guī)則是:誰(shuí)指定在后面谣光,誰(shuí)就生效i萘堋!萄金!

-i在-n之后蟀悦,-n將被忽略

實(shí)際上,-i就是隱含了-L 1氧敢,-i分批并傳遞這兩個(gè)作用跟嚴(yán)格些日戈。


6. xargs觀察命令的執(zhí)行過(guò)程

使用-p選項(xiàng)是交互詢問(wèn)式的,只有每次詢問(wèn)的時(shí)候輸入y(或者yes)才會(huì)執(zhí)行孙乖,直接按entry鍵是不會(huì)執(zhí)行的浙炼。

使用-t選項(xiàng)是在每次執(zhí)行xargs后面的命令都會(huì)先在stderr上打印一遍命令的執(zhí)行過(guò)程然后才正式執(zhí)行份氧。

使用-p-t選項(xiàng)就可以根據(jù)xargs后面的命令的執(zhí)行順序進(jìn)行推測(cè),xargs是如何分段鼓拧,分批以及傳遞的半火。

-p或者-t參數(shù)如何使用

【后續(xù)】 分批選項(xiàng)的的典型應(yīng)用

1. 同一目錄下文件過(guò)多

分批選項(xiàng)有時(shí)特別有用,例如腳本規(guī)定每次只能傳遞三個(gè)參數(shù)季俩,有時(shí)候grep或者rm -rf文件數(shù)量特別多的時(shí)候會(huì)提示參數(shù)列表過(guò)長(zhǎng)而導(dǎo)致失敗钮糖,這時(shí)候就可以分批來(lái)按批查詢或刪除。
命令:ls | xargs -n 10000 rm -rf

2. xargs+find的使用

xargs原本就是為find而開(kāi)發(fā)的酌住。

find命令將匹配到的文件傳遞給xargs命令店归,而xargs命令每次只獲取一部分而不是全部。不像-exec選項(xiàng)那樣酪我,這樣就可以先處理最先獲取的一部分文件消痛,然后是下一批。

實(shí)際應(yīng)用:

ls+grep跨目錄查詢時(shí)都哭,我們將文件通過(guò)管道輸入到grep參數(shù)處秩伞,此時(shí)并沒(méi)有包含目錄地址,邊會(huì)出現(xiàn)下面的錯(cuò)誤欺矫。

ls + grep 跨目錄查詢

解決方案:

find找到的文件地址傳遞給grep命令的參數(shù)處纱新。

find+grep
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市穆趴,隨后出現(xiàn)的幾起案子脸爱,更是在濱河造成了極大的恐慌,老刑警劉巖未妹,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件簿废,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡络它,警方通過(guò)查閱死者的電腦和手機(jī)族檬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)化戳,“玉大人单料,你說(shuō)我怎么就攤上這事∮厮福” “怎么了看尼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵递鹉,是天一觀的道長(zhǎng)盟步。 經(jīng)常有香客問(wèn)我,道長(zhǎng)躏结,這世上最難降的妖魔是什么却盘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上黄橘,老公的妹妹穿的比我還像新娘兆览。我一直安慰自己,他們只是感情好塞关,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布抬探。 她就那樣靜靜地躺著,像睡著了一般帆赢。 火紅的嫁衣襯著肌膚如雪小压。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天椰于,我揣著相機(jī)與錄音怠益,去河邊找鬼。 笑死瘾婿,一個(gè)胖子當(dāng)著我的面吹牛蜻牢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播偏陪,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼抢呆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了竹挡?” 一聲冷哼從身側(cè)響起镀娶,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎揪罕,沒(méi)想到半個(gè)月后梯码,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡好啰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年轩娶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片框往。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鳄抒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出椰弊,到底是詐尸還是另有隱情许溅,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布秉版,位于F島的核電站贤重,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏清焕。R本人自食惡果不足惜并蝗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一祭犯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滚停,春花似錦沃粗、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至起惕,卻和暖如春檩禾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疤祭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工盼产, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勺馆。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓戏售,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親草穆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子灌灾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,370評(píng)論 0 5
  • 為什么要用xargs,問(wèn)題的來(lái)源 在工作中經(jīng)常會(huì)接觸到xargs命令悲柱,特別是在別人寫(xiě)的腳本里面也經(jīng)常會(huì)遇到锋喜,但是卻...
    云揚(yáng)_fb42閱讀 613評(píng)論 0 1
  • 一、背景 ??工作中經(jīng)常會(huì)接觸到xargs命令豌鸡,特別是在別人寫(xiě)的腳本里面也經(jīng)常會(huì)遇到嘿般,但是卻很容易與管道搞混淆,本...
    Carl_TSNE閱讀 241評(píng)論 0 0
  • 參考文檔:https://www.cnblogs.com/wangqiguo/p/6464234.html,這篇文...
    狗狗胖妞閱讀 718評(píng)論 0 3
  • 本文筆記源自這里——[實(shí)驗(yàn)樓]歡迎大家在下面交流其中有問(wèn)題的地方喜歡請(qǐng)點(diǎn)收藏蛇更,每日更新(全部已親自實(shí)踐). 一. ...
    東皇Amrzs閱讀 3,971評(píng)論 7 54