溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

find、xargs、grep和管道怎么使用

發(fā)布時間:2022-03-16 16:37:37 來源:億速云 閱讀:272 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“find、xargs、grep和管道怎么使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“find、xargs、grep和管道怎么使用”文章能幫助大家解決問題。

問題:

相信大家都知道在目錄中搜索含有固定字符串文件的命令:

find . -name '*.py' |xargs grep test

剛開始的時候,我不熟悉xargs命令,所以直接使用的命令是

find . -name '*.py' |grep test

結果并不是自己所期望的。此命令只是找出文件名*.txttest的情況。 

這里我就研究一下,究竟xargs做了什么,使得結果不相同。

參數(shù)與標準輸入:

這兩個詞我們在Linux命令中是很常見的。但是參數(shù)和標準輸入其實是有區(qū)別的。我們?nèi)粘J褂玫暮芏嗝?,例?code>ls -lah .中。l, a, h ,.都是命令ls的參數(shù)。至于標準輸入,可以說它某種流數(shù)據(jù)。而通常來講標準輸入的流數(shù)據(jù)來源就是我們的終端輸入。在Linux命令中,有些命令可以接收標準輸入,有些是不能的。像上面的ls,就是只能接收參數(shù),不能接收標準輸入。像cat命令或echo命令,這些是可以的。

怎么分辨一個命令可不可以接收標準輸入?很簡單,當你敲完命令回車后,終端會等待接收你的輸入,例如當你在終端輸入cat后,終端會等待你輸入字符,當你輸入一些字符后,然后按Ctrl-C發(fā)送終止符號。這時cat命令接收標準輸入完畢,執(zhí)行命令,也就是將剛才鍵入的內(nèi)容輸出的標準輸出上(屏幕)。

管道:

管道的作用是將前面命令的標準輸出作為后面命令的標準輸入。這里要注意,后面的命令接收的是標準輸入,所以如果命令不支持接收標準輸入,那么就不能直接使用管道,例如常用的ls命令,只能使用參數(shù),而不能使用標準輸入,所以[command] | ls是不能使用的。而命令如echocat就可以。那么肯定有方法來實現(xiàn)這些不能使用標準輸入的命令與管道結合,這時候xargs便出場了。

xargs命令:

xargs命令通俗來講就是將標準輸入轉(zhuǎn)成各種格式化的參數(shù),所以命令[command 1] | xargs [command 2]就是將command 1的標準輸出結果,通過管道|變成xargs的標準輸入,然后xargs再將此標準輸入變成參數(shù),傳給[command 2]。這樣一來,通過xargs命令,我們便可以在管道后面使用那些不接收標準輸入的命令了。例如[command 1]|xargs ls,是不是很熟悉?

find與grep:

有了以上的知識點,到這里終于可以解答最開始的問題了。為什么命令

find . -name '*.py' |grep test

和 

find . -name '*.py' |xargs grep test

的結果是不一樣的了。 

我們首先來查看grep手冊。通過man grep命令。

DESCRIPTION
      grep searches the named input FILEs (or standard input if no files are named, or if a single hyphen-minus (-) is given as file name) for lines containing a match to the given PATTERN.  By default, grep prints the matching lines. 

這里可以看到grep是支持標準輸入的。

假設目錄存在如下文件:

$ ls
Altitest.py  python.py  runora.py  test.py  TransferFile.py 

那么對于第一個命令find . -name '*.py' |grep test,是將前面命令的標準輸出作為標準輸入傳給了grep test,那么grep是從這些標準輸入尋找test字符,也就是文件名組成的字符流

$ find . -name '*.py' |grep test
./Altitest.py
./test.py 

可以看到最終選擇出的是這些文件名。

而對于第二個命令find . -name '*.py' |xargs grep test,通過xargsfind得到的文件名成為了參數(shù)傳給后面的grep,那么這時候這些文件名就是實實在在的文件標識,grep接收后會按正常的使用方式在各文件中搜尋字符串。

#find . -name '*.py' |xargs grep test
./runora.py:testConn = cx_Oracle.connect('user/passwd@tns')
./runora.py:testCursor = testConn.cursor()
./runora.py:testCursor.execute("select * from table")
./runora.py:rows = testCursor.fetchall()
./runora.py:testCursor.close()
./runora.py:testConn.close()

到這里算是將find,grepxargs和管道的作用理解清楚了。

  1. xargs還有指定參數(shù)位置的作用。假設我們要將目錄下所有的.py文件放到Python目錄中去,可以使用命令
    find . -name '*.py' | xargs -I {} mv {} ./Python
    參數(shù)-I指定了管道前命令作為參數(shù)所應該在管道后面命令的位置。

  2. 我們在查看很多命令手冊時,手冊會說明命令的使用方法。例如
    grep [OPTIONS] PATTERN [FILE...],也就是命令的最后一個位置是文件名[FILE]。
    這里要注意這個文件名[FILE]也是參數(shù)。

關于“find、xargs、grep和管道怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識,可以關注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI