你是否遇到過需要在檔案中查找一個特定的字元串或者樣式,但是不知道從哪兒開始?那麼,就請grep來幫你吧。

grep是每個linux發行版都預裝的一個強有力的檔案模式搜尋工具。無論何種原因,如果你的系統沒有預裝它的話,你可以很容易的通過系統的包管理器來安裝它(debian/ubuntu系中的apt-get和rhel/centos/fedora系中的yum)。
我發現使用現實世界中的真執行個體子讓你投身其中是讓你接觸grep指令的最容易方式。
<a target="_blank"></a>
假設你已經在你的電腦上安裝了一個全新的ubuntu,然後你打算解除安裝python。你浏覽網頁尋找教程,但是你發現存在兩個不同版本的python在使用,而你不知道你的ubuntu安裝器到底在你的系統中安裝了哪個版本的python,也不知道它安裝了哪些子產品。解決這個煩惱隻需簡單的運作以下指令:
首先,我們運作dpkg -l列出你系統上安裝的.deb包。接着,我們使用管道将輸出結果傳輸給指令grep -ipython,這一步可以簡單解釋為把結果傳輸給grep然後過濾出所有含有python的項,并傳回結果。–i選項用于忽略大小寫,因為 grep 是大小寫敏感的。使用選項-i是個好習慣,除非你打算進行更細節的搜尋。
grep還可以在一個或多個檔案裡用于搜尋和過濾。讓我們來看一個這樣的情景:
你的apache網頁伺服器出現了問題,你不得不從許多專業網站裡找一個發帖詢問。好心回複你的人讓你粘貼上來你的/etc/apache2/sites-available/default-ssl檔案内容。假如你能移除掉所有的注釋行,那麼對你,對幫你的人,以及所有閱讀該檔案的人,不是更容易發現問題嗎?你當然可以很容易的做到!隻需這樣做就可以了:
選項-v是告訴grep指令反轉它的輸出結果,意思就是不輸出比對的項,做相反的事,列印出所有不比對的項。這個例子中,有#的是注釋行(譯注:其實這個指令并不準确,包含“#”的行不全是注釋行。關于如何精确比對注釋行,可以了解更多的關于正規表達式的内容。)。
grep指令對于過濾來自于标準輸出的結果非常有用。例如,假設你的一個檔案夾裡面全是各種格式的音樂檔案。你要找出藝術家jayz的所有mp3格式的音樂檔案,裡面也不要有任何混合音軌。使用find指令再結合管道使用grep就可以完成這個魔法:
在這個例子中,我們使用find指令列印出所有以.mp3為字尾名的檔案,接着将其使用管道傳遞給grep -i過濾和列印出名字為“jayz”的檔案,再使用管道傳送給grep -vi以便過濾掉含有“remix”的項。
<a href="http://www.tecmint.com/35-practical-examples-of-linux-find-command/" target="_blank">35個linux中find指令的實踐例子</a>
另外兩個選項是-a和-b之間的切換,是用以顯示比對的行以及行号,分别控制在字元串前或字元串後顯示的行數。man頁給出了更加詳細的解釋,我發現一個記憶的小竅門:-a=after、-b=before。
grep指令的-c選項和例4中的很相似,不過列印的并不是在比對字元串的前面或後面的行,而是列印出兩個方向都比對的行(譯注:同上面的記憶竅門一樣:-c=center,以此為中心): $ sudo ifconfig | grep -c 2 lo
這個功能類似于将grep輸出的結果用管道傳送給計數器(wc程式),grep内建的選項可以達到同樣的目的:
當你在編譯出錯時需要調試時,grep指令的-n選項是個非常有用的功能。它能告訴你所搜尋的内容在檔案的哪一行:
假若你要在目前檔案夾裡搜尋一個字元串,而目前檔案夾裡又有很多子目錄,你可以指定一個-r選項以便于遞歸的搜尋: $ sudo grep -r "function" *
傳遞-w選項給grep指令可以在字元串中進行精确比對搜尋(譯注:包含要搜尋的單詞,而不是通配)。例如,像下面這樣輸入:
将列印出含有引号内比對項的行。另外,你還可以試一下這個:
搜尋這個比對項時,若搜尋的東西裡面沒有這樣的一個單獨的單詞,将什麼也不會傳回。
我們還要關注一下grep的衍生應用。第一個是zgrep,這個與zcat很相似,可以用于gzip壓縮過的檔案。它有與grep相似的指令選項,使用方式也一樣:
egrep是另一個衍生應用,代表着“擴充全局正規表達式”。它可以識别更多的正規表達式元字元,例如at + ?| 和()。在搜尋源代碼檔案時,egrep是一個非常有用的工具,還有其他的一些零碎代碼檔案的搜尋需要,使得這樣的搜尋能力成為必需。可以在grep指令中使用選項-e來啟用它。
$ sudo grep -e
fgrep用于在一個檔案或檔案清單中搜尋固定樣式的字元串。功能與grep -f同。fgrep的一個通常用法為傳遞一個含有樣式的檔案給它:
這僅僅是grep指令的開始,你可能已經注意到,它對于實作各種各樣的需求簡直是太有用了。除了這種我們運作的這種隻有一行的指令,grep還可以寫成cron任務或者自動的shell腳本去執行。保持好奇心,試驗一下man頁的各個選項,為實作你的目的寫出一些grep表達式吧。
原文釋出時間為:2013-11-14
本文來自雲栖社群合作夥伴“linux中國”