通道符和xargs命令


通道符“|“:是將前一個命令的輸出做為后一個命令的標准輸入。注意:這里的標准輸入指的是:通道符右側命令的處理內容,也就是說左側的標准輸出不能作為右側命令的參數,只能作為命令的處理對象。

簡單講:只有通道符時,右側命令將左側輸出作為處理內容。加上xargs后,將左側輸出作為參數。具體看下面wc命令的執行,就明白了。

寫起來都很別扭,理解起來也費勁啊,還是舉例子吧:

1、環境:假設當前目錄下,tesy文件夾內有3個文件,t1.c,t2.c,t3.c

t1.c內容:

hello,I am t1

ok

t2.c內容:

this is t2

t3.c內容:

I am t3

I have 3 lines

look it

然后,我再當前目錄建立一個文件t,內容如下:

t1.c

t2.c

t3.c

最后,我在當前目錄執行: cat t | ls -l 

[root@noi ~]# cat t | ls -l
total 8
-rw-r--r-- 1 root root   30 Jun  8 12:11 t
drwxr-xr-x 2 root root 4096 Jun  8 12:10 tesy

也輸出了內容,和我們的想法不一樣,我們想的是將t文件內的文件列表傳給ls命令,然后一一列出詳細屬性。但是顯然輸出的不對,那么這些到底是怎么運作的呢?

cat t命令產生的標准輸出通過通道符傳給了ls命令,但是ls命令拋棄了,因為ls命令不能處理流,它不是一個文本處理軟件,然后ls獨自運行,因為沒有參數,所以最終執行的命令是:

ls -l

就將當前目錄作為默認參數,顯示出來。

然后運行:

cat t | xagrs ls -l
[root@noi ~]# cat t | xargs ls -l
-rw-r--r-- 1 root root 18 Jun  8 12:10 tesy/t1.c
-rw-r--r-- 1 root root 11 Jun  8 12:09 tesy/t2.c
-rw-r--r-- 1 root root 31 Jun  8 12:09 tesy/t3.c

看到沒?正確執行了我們的意圖。xargs命令將從cat t得到的標准輸出,作為參數傳遞給ls命令,這樣ls命令得到3個參數,最終執行: ls -l t1.c t2.c t3.c 

2、如果上題還有疑問,那么wc命令將最終為您解惑:

執行:

cat t | wc -l

wc命令將cat的輸出作為處理內容,進行計算,最終輸出3,表示有3行。

[root@noi ~]# cat t | wc -l
3

執行:

cat t | xargs wc -l

xargs將cat輸出的3行作為wc的參數傳遞進來,於是最終執行: wc -l t1.c t2.c t3.c 

[root@noi ~]# cat t | xargs wc -l
 2 tesy/t1.c
 1 tesy/t2.c
 3 tesy/t3.c
 6 total

看到沒?wc最終計算的是t1.c,t2.c,t3.c這三個文件,而不是t文件。這就是xargs的作用,將標准輸出轉為命令的參數,而不是命令的處理內容。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM