grep是(shì)每個(gè)Linux發行(xíng)版都(dōu)預≥≈φ裝的(de)一(yī)個(gè)強有(yǒu)力的(de)文(wλ÷♦én)件(jiàn)模式搜索工(gōng)具。無論何種原因,如↕♦(rú)果你(nǐ)的(de)系統沒有(yǒu)預裝它的(επ ÷de)話(huà),你(nǐ)可(kě)以很(hěn)容易的(de)通(&'tōng)過系統的(de)包管理(lǐ)器(qì)來(lái)安裝它(Deb ≈ian/Ubuntu系中的(de)apt-get和(hé)♠§←§RHEl/CentOS/Fedora系中的(dασe)yum)。
$ sudo apt-get install ✔grep #Debian/Ubuntu $ sudo yu®★βm install grep #RHEL/CentOS/Fedora
我發現(xiàn)使用(yòng)現(xiàn)實世界中的(de)真實例子(z♥$φǐ)讓你(nǐ)投身(shēn)其中是(shì)讓你∑↔±(nǐ)接觸grep命令的(de)最容易方式。
1.搜索和(hé)尋找文(wén)件(jiàn)
假設你(nǐ)已經在你(nǐ)的(de)電(diàn)腦≥λ×(nǎo)上(shàng)安裝了(le)一(↕¥∞yī)個(gè)全新的(de)Ubuntu,然後你(nǐ)打算(suàn∏)卸載Python。你(nǐ)浏覽網頁尋找ε≥教程,但(dàn)是(shì)你(nǐ)發現(xiàn)存在∏→φ¥兩個(gè)不(bù)同版本的(de)Python在使用(yòng ×),而你(nǐ)不(bù)知(zhī)道(dào)你(n♣↓ǐ)的(de)Ubuntu安裝器(qì)到(dào)底在你(nǐ)的(d ∑e)系統中安裝了(le)哪個(gè)版本的(π₽de)Python,也(yě)不(bù)知(zhī↕ε)道(dào)它安裝了(le)哪些(xiē)模塊。解決這(zhè)個(gè)煩Ω惱隻需簡單的(de)運行(xíng)以下(xià)命令:
$ sudo dpkg -l | <'σλgrep -i python
輸出例子(zǐ)
ii p♠>ython2.7  $≤; &n•≈γbsp; 2.7.3-0ubunt₹♠"£u3.4 Interactive hi♦φgh-level object-→γoriented language (v✔↔≠ersion 2.7)
ii py↑thon2.7-minimal 2.★¥ ™7.3-0ubuntu3.4 Minimal subset of t<★₩he Python language (ver→'€≤sion 2.7)
ii &♣₹∏∑nbsp;python-openssl ←≤& 0.12-1ubuntu2.1&nb↑®$sp; Python wrapper around the Op∞>λenSSL library
ii  •β¥;python-pam & ∏¶nbsp; 0.4.↔←2-12.2ubuntu4 A Python& ¥©∏nbsp;interface to th↓•≈e PAM library
首先,我們運行(xíng)dpkg -l列出你(nǐ)系統上≥λ≠☆(shàng)安裝的(de).deb包。接著(zhe),我們使用(∞ Ωyòng)管道(dào)将輸出結果傳輸給命令gr&£☆ep -i python,這(zhè)一(yī)步可(kě)以簡單解釋為(₹♥≤wèi)把結果傳輸給grep然後過濾出所有(yǒu)含有(yǒu€ )python的(de)項,并返回結果。–i選項用(yòng)于 ✔忽略大(dà)小(xiǎo)寫,因為(wèi) grep 是(shì) ∏≈"大(dà)小(xiǎo)寫敏感的(de)。使用(yòng)選₹✘項-i是(shì)個(gè)好(hǎo)習 ™∏£(xí)慣,除非你(nǐ)打算(suàn)進∑¶≤行(xíng)更細節的(de)搜索。
2.搜索和(hé)過濾文(wén)件(jiàπ✘↔ n)
grep還(hái)可(kě)以在一(yī)個(gè)或多(duō)≈ε 個(gè)文(wén)件(jiàn)裡(lǐ)用(yòng)于搜♠♣Ω索和(hé)過濾。讓我們來(lái)看(kàn)一(yī)個(gè)這(z∏♦hè)樣的(de)情景:
你(nǐ)的(de)Apache網頁服務器(qì)出現(x©↑<iàn)了(le)問(wèn)題,你(nǐ)不(bù)©λ↕得(de)不(bù)從(cóng)許多(duōΩπ¥£)專業(yè)網站(zhàn)裡(lǐ)找一(yī)個(g¥£β≠è)發帖詢問(wèn)。好(hǎo)心回複你(nǐ)的(de)人(r$↑én)讓你(nǐ)粘貼上(shàng)來(lπ≥£•ái)你(nǐ)的(de)/etc/apache©÷2/sites-available/defa♣∑Ω ult-ssl文(wén)件(jiàn)內(nèi)容。假如(rú)你&↕(nǐ)能(néng)移除掉所有(yǒu)的(d≈≥¶®e)注釋行(xíng),那(nà)麽對(duì)你∞&β(nǐ),對(duì)幫你(nǐ)的(de)人(rén),以及所有(™ ♦§yǒu)閱讀(dú)該文(wén)件(jiàn)的(de)人(rén),→€'不(bù)是(shì)更容易發現(xiàn)問(w←∑èn)題嗎(ma)?你(nǐ)當然可(kě)以很(hěn↑≠)容易的(de)做(zuò)到(dào)!隻需這(zhè)樣做(zuò)↑→就(jiù)可(kě)以了(le):
$ sudo grep -v " ";#" /etc/apache2/sites-available/dβ©δ₽efault-ssl
選項-v是(shì)告訴grep命令反轉它的(de)©♣£₹輸出結果,意思就(jiù)是(shì)不(bù)輸出匹↓÷配的(de)項,做(zuò)相(xiàng)反的(de)事(shì),打印出α©♥所有(yǒu)不(bù)匹配的(de)項。₽'這(zhè)個(gè)例子(zǐ)中,有(€↔yǒu)#的(de)是(shì)注釋行(xí∏↑×ng)(譯注:其實這(zhè)個(gè)命令并不(bù•)準确,包含“#”的(de)行(xφε₹íng)不(bù)全是(shì)注釋行(xíng)。關于如(rú)何精确匹 γ配注釋行(xíng),可(kě)以了(le)解更多(duō)的(de)關于←£正則表達式的(de)內(nèi)容。)。
3.找出所有(yǒu)的(de)mp3文(wén)件(jiàn)€¥<←
grep命令對(duì)于過濾來(lái)自(¥λγ★zì)于标準輸出的(de)結果非常有(yǒu)用(yòng)。例如(r•γ®ú),假設你(nǐ)的(de)一(yī)個( ↕gè)文(wén)件(jiàn)夾裡(lǐ)面全是φσ≠(shì)各種格式的(de)音(yīn)樂'< δ(yuè)文(wén)件(jiàn)。你(nǐ)要(yào)找 ♣φ÷出藝術(shù)家(jiā)jayZ的(de)所有(yǒu)mp3格式的(de∑±∞§)音(yīn)樂(yuè)文(wén)件(jiàn),裡(♠σ↔lǐ)面也(yě)不(bù)要(yào)有(yǒu) ↑↕任何混合音(yīn)軌。使用(yòng)find命令再結合管道(dào)使用(φ≈ yòng)grep就(jiù)可(kě)以完₹✘€∑成這(zhè)個(gè)魔法:
$ sudo find . - ★name ".mp3" | grep -i J₹↑ayZ | grep -vi "remi¥¥÷∞x""
在這(zhè)個(gè)例子(zǐ)中,我們使用(yòng)find♦™✘命令打印出所有(yǒu)以.mp3為(wèi)後綴名的(de)文(w陥n)件(jiàn),接著(zhe)将其使用(yòng)管道(dào)傳遞給 ≥ ∏grep -i過濾和(hé)打印出名字為(wèi)&ldquΩ←o;JayZ”的(de)文(wén)件(jiàσ© n),再使用(yòng)管道(dào)傳♠≠§γ送給grep -vi以便過濾掉含有(yǒu)“re §λ∑mix”的(de)項。
4.在搜索字符串前面或者後面顯示行(xíng)号
另外(wài)兩個(gè)選項是(shì)₩±-A和(hé)-B之間(jiān)的(de)切換,是(s≠δφ×hì)用(yòng)以顯示匹配的(de)行(xíng)以及行(xí↕$αng)号,分(fēn)别控制(zhì)在字符串前或字符串後顯示的(de)行φ'↓↑(xíng)數(shù)。Man頁給出了(le$♥)更加詳細的(de)解釋,我發現(xiàn)一(yī)&↑∑個(gè)記憶的(de)小(xiǎo)竅門(mén):-A=₹✔±σafter、-B=before。
$ sudo ifconfig | grep -A 4 etho β$$ sudo ifconfig | grep -B 2 UP
5.在匹配字符串周圍打印出行(xíng)号
grep命令的(de)-C選項和(hé)例♦← ♥4中的(de)很(hěn)相(xiàng)似,不(bù)✔♣•過打印的(de)并不(bù)是(shì)在匹配字符串的(d"δe)前面或後面的(de)行(xíng),而是(§↓±shì)打印出兩個(gè)方向都(dōu)匹配的(" de)行(xíng)(譯注:同上(shàn★✔g)面的(de)記憶竅門(mén)一(yī)樣: ₽∑-C=center,以此為(wèi)中心): $ su↓♥do ifconfig | grep -C 2 l☆≤o
6.計(jì)算(suàn)匹配項的(de)數(shù)目
這(zhè)個(gè)功能(néng)類似于将grep輸出的(d♥™±e)結果用(yòng)管道(dào)傳送給計(jì)數(shù)器( ₩πqì)(wc程序),grep內(nèi)建的(de)選項可(kě£§ε≥)以達到(dào)同樣的(de)目的(de):
$ sudo ifconfig | grep -c inet"δ↕₽6
7.按給定字符串搜索文(wén)件(jiàn)中匹配的(de)行(xíng£★γ)号
當你(nǐ)在編譯出錯(cuò)時(shíλ♠δ)需要(yào)調試時(shí),grep命令的(de)-n選項是(sσ¶¶∑hì)個(gè)非常有(yǒu)用(yòng)的(de)功能(nén←§ ₩g)。它能(néng)告訴你(nǐ)所搜¥↕©✘索的(de)內(nèi)容在文(wén)件(jiàn)的(de)哪一∏≥✔(yī)行(xíng):
$ sudo grep -n "main&quo±≤t; setup.py
8.在所有(yǒu)目錄裡(lǐ)遞歸的(de)搜索
假若你(nǐ)要(yào)在當前文(wén)件(jiàn)夾裡(lǐπ™✘←)搜索一(yī)個(gè)字符串,而當前文(σα₩wén)件(jiàn)夾裡(lǐ)又(yòu)有(yǒu)很(hěn)多(duΩφγ&ō)子(zǐ)目錄,你(nǐ)可(kě)以指定一(yī)個(g£•è)-r選項以便于遞歸的(de)搜索: $ su'↓≈do grep -r “functio$×n” *
9.進行(xíng)精确匹配搜索
傳遞-w選項給grep命令可(kě)以在字符串中進行(xín ∏g)精确匹配搜索(譯注:包含要(yào)搜索的(de)單詞,而不(bù)是 ¶¥★(shì)通(tōng)配)。例如(rú),像下(xià)面這(∏εzhè)樣輸入:
$ sudo ifconfig | grep -w “RUNNI∞→NG”
将打印出含有(yǒu)引号內(nèi)匹配項的(de)行(xín↑₽→♥g)。另外(wài),你(nǐ)還(hái)可(k•∞ě)以試一(yī)下(xià)這(zhè)個(gè):
$ sudo ifconfig | grep ≈≤±-w “RUN”β₹<
搜索這(zhè)個(gè)匹配項時(shí),若搜索的(€¥de)東(dōng)西(xī)裡(lǐ)面沒有(yǒu)這(z₹∏≈∏hè)樣的(de)一(yī)個(gè)單獨的(de)±™✘單詞,将什(shén)麽也(yě)不(bù)會'₹←(huì)返回。
10.在Gzip壓縮文(wén)件(jiàn)中搜索
我們還(hái)要(yào)關注一(yī)下¥ (xià)grep的(de)衍生(shēng)應用(yòng)。第一(yī)β ♠個(gè)是(shì)zgrep,這(zhè)個(gè)與zcat很(hěn→ε×β)相(xiàng)似,可(kě)以用(yòng)于gzip壓縮過的♣∞(de)文(wén)件(jiàn)。它有(δλyǒu)與grep相(xiàng)似的(de)命令選項,使用♣★±(yòng)方式也(yě)一(yī)樣:
$ sudo zgrep -i error /var/loφ↔ε$g/syslog.2.gz
11.在文(wén)件(jiàn)中匹配正則表達式
egrep是(shì)另一(yī)個(gè)衍生(shēng)應用($♣₩®yòng),代表著(zhe)“擴展全局∑☆ ✔正則表達式”。它可(kě)以識别更多(duō)的(de)正則πΩ÷表達式元字符,例如(rú)at + ? | 和(hé)()。在搜索源代碼♥±文(wén)件(jiàn)時(shí),egrep是(±Ωεshì)一(yī)個(gè)非常有(yǒu)₩≤✘∞用(yòng)的(de)工(gōng)具,還(hái)有(yǒu)其他(tā₩±φ)的(de)一(yī)些(xiē)零碎代碼文↓♥✔(wén)件(jiàn)的(de)搜索需要(yào),使得(de)這(zh→®è)樣的(de)搜索能(néng)力成為(wè★φ€γi)必需。可(kě)以在grep命令中使用(yòng)選±≥項-E來(lái)啓用(yòng)它。
$ sudo grep -E
12.搜索一(yī)個(gè)固定匹配字符串
fgrep用(yòng)于在一(yī)個(gè¥$★)文(wén)件(jiàn)或文(wén)件(ji±↑αàn)列表中搜索固定樣式的(de)字符串。×₽功能(néng)與grep -F同。fgrep的(de)一σδ(yī)個(gè)通(tōng)常用(yòng)法為(wèi)δ∞傳遞一(yī)個(gè)含有(yǒu)樣式的(®δde)文(wén)件(jiàn)給它:
$ sudo fgrep -f file_full_of_p← atterns.txt file_to_search.txα≠♣$t
這(zhè)僅僅是(shì)grep命令的(de)開(kā ↑↕i)始,你(nǐ)可(kě)能(néng)已<"✔α經注意到(dào),它對(duì)于實現(xiàn)各種各樣的(de)♠≈← 需求簡直是(shì)太有(yǒu)用(yòng)§₹了(le)。除了(le)這(zhè)種我們運行(xíng)的(€®Ωφde)這(zhè)種隻有(yǒu)一(yī)行(xíng)的(de)♦©≈≥命令,grep還(hái)可(kě)以寫成cron任務或者自(zì¥∞÷)動的(de)shell腳本去(qù)執行(xíng)。保持好(hǎo)奇心,✘λ試驗一(yī)下(xià)man頁的(de)各個(gè)選項,為π×≥(wèi)實現(xiàn)你(nǐ)的(de)目δ的(de)寫出一(yī)些(xiē)grep≤★表達式吧(ba)。
英文(wén):tecmint,翻譯:Linux中國(guó&$")/Linux-pdz
linux.cn/article-2250-1.'§html