作者:守望先生 公眾號(hào):編程珠璣 前言之前介紹過(guò)很多l(xiāng)inux下查找相關(guān)的命令,而對(duì)文件內(nèi)容搜索的命令似乎還沒(méi)有涉及,因此本文介紹文本搜索命令--grep。 常見(jiàn)用法我們會(huì)經(jīng)常結(jié)合管道符(|)來(lái)使用它,即在前面命令執(zhí)行的結(jié)果中查找包含相關(guān)字符串的內(nèi)容。例如: $ ps -ef|grep redis ps -ef用于查看系統(tǒng)進(jìn)程情況,但是它列出的結(jié)果很多,如果我們只想看到自己需要的,則通過(guò)管道符,用grep進(jìn)行過(guò)濾搜索,例如搜索redis相關(guān)的進(jìn)程,最后它只會(huì)列出和redis相關(guān)的進(jìn)程了:
那么如果要排除某些不相關(guān)信息呢?我們可以使用-v參數(shù) $ ps -ef|grep redis |grep -v auto 這樣一來(lái),包含auto相關(guān)的結(jié)果就不會(huì)出現(xiàn)在最終結(jié)果里了。 如果只想統(tǒng)計(jì)結(jié)果數(shù)量呢?我們可以結(jié)合-c(count)參數(shù):
文件內(nèi)容搜索好了,說(shuō)完了最常見(jiàn)的用法,我們來(lái)看看如何搜索文件內(nèi)容。實(shí)際上awk和sed在這方面也頗有經(jīng)驗(yàn),不過(guò)本文的主角是grep,所以另外兩個(gè)命令暫時(shí)不涉及。我們來(lái)看幾個(gè)實(shí)例。 在指定文件中查找指定關(guān)鍵字例如,要在linux_command_debug.md文件中,查找test字符串: $ grep 'test' aaa/bbb/linux_command_debug.md 如果想要顯示指定關(guān)鍵字的行號(hào),可以使用-n參數(shù),例如:
搜索時(shí)指定或排除多個(gè)文件前面提到了對(duì)一個(gè)文件內(nèi)容進(jìn)行搜索,如果是多個(gè)呢?或者不想從某些文件里搜索呢? 如果想對(duì)文件進(jìn)行指定也是可以的,例如搜索所有的md結(jié)尾的文件: $ grep -n 'test' *.md 或者可以使用--exclude參數(shù)來(lái)排除某些文件,例如,查找包含test,但是排除txt文件:
搜索時(shí)就會(huì)忽略.txt結(jié)尾的文件了。 如果要排除的條件比較多,可以將要排除的條件存儲(chǔ)在另外一個(gè)文件里: $ grep -rn 'test' --exclude-from=skip.txt skip.txt的內(nèi)容可以是模式匹配的文件名或者具體文件名:
這樣,以.txt結(jié)尾,以及test.md文件都不會(huì)搜索了。 除此之外,還可以排除指定目錄,它需要用到--exclude-dir參數(shù): $ grep -rn 'test' --exclude-dir=aaa 它在搜索時(shí)將會(huì)跳過(guò)aaa目錄下的文件。 查找包含指定關(guān)鍵字的文件如果要在當(dāng)前目錄下所有文件查找包含“int main(void)”字符串的文件:
這可能是最實(shí)用的使用方法之一了。這里-r參數(shù)表示遞歸查找當(dāng)前目錄的文件,-n會(huì)顯示查找位置的行號(hào),如果只想顯示包含該指定關(guān)鍵字的文件名,可使用-l(--file-with-matches)參數(shù): $ grep -rln 'int main(void)' 如果你嘗試一下就會(huì)發(fā)現(xiàn),如果不帶-r參數(shù),它會(huì)暫停,等待你從控制臺(tái)輸入,例如:
所以使用時(shí)記得帶上相關(guān)參數(shù)奧! 查找不包含指定關(guān)鍵字的文件前面提到了如何查找包含某個(gè)關(guān)鍵字的文件,如果要找的是不包含該關(guān)鍵字的文件呢? $ grep -rLn 'int main(void)' 搜索時(shí)忽略大小寫使用-i(--ignore-case)參數(shù)即可:
搜索顯示不包含指定關(guān)鍵字的行前面的大部分例子都是顯示符合條件的行,如果要顯示不符合條件的行呢?可以用我們前面提到的-v參數(shù): $ grep -rnv 'int main(void)' 從結(jié)果中就會(huì)發(fā)現(xiàn),它會(huì)展示出包含指定關(guān)鍵字的文件,但是展示的是不包含該關(guān)鍵字的行。 顯示指定關(guān)鍵字前后內(nèi)容假如你需要查看包含指定關(guān)鍵字行附近的行,前面的方式是沒(méi)有辦法看到的,不過(guò)我們可以用-A(--after-context=)和-B(--before-context=)參數(shù)來(lái)顯示前后的行:
通過(guò)最后加上-A和-B參數(shù),顯示了指定關(guān)鍵字前后的行,這在日志搜索分析時(shí)非常有用。 指定規(guī)則文件進(jìn)行搜索如果有多個(gè)搜索關(guān)鍵字怎么處理呢?我們可以把關(guān)鍵字寫在一個(gè)文件,搜索時(shí)指定文件即可,例如規(guī)則文件為key.txt: int main(void) 從指定文件中搜索上面的關(guān)鍵字:
這樣結(jié)果就會(huì)顯示匹配key.txt文件中所有關(guān)鍵字的行,非常適合用于多個(gè)條件的搜索。 正則表達(dá)式搜索看完前面的內(nèi)容,是不是還沒(méi)有感受到grep的強(qiáng)大?grep的另一個(gè)強(qiáng)大之處是,它的搜索支持正則表達(dá)式,例如查找文本行以t開(kāi)頭,以t結(jié)尾的文件: $ grep -rn ^t.*t$ 其中^t,表明以t開(kāi)頭,t$表明以t結(jié)尾,如果需要使用擴(kuò)展的正則表達(dá)式進(jìn)行搜索,可使用egrep命令。關(guān)于正則表達(dá)式的寫法,本文不做詳細(xì)介紹。 總結(jié)在內(nèi)容搜索方面,grep常常能夠助我們一臂之力,因此掌握grep的使用也是linux學(xué)習(xí)不可缺少的一部分,當(dāng)然我們不需要完全記住每個(gè)參數(shù)的作用,但我們至少知道有這樣的參數(shù),并且在需要時(shí)能夠快速查詢到。本文常用參數(shù)如下:
|
|
來(lái)自: 西北望msm66g9f > 《培訓(xùn)》