[Shell]grep命令


我是好文章的搬運工,原文來自ChinaUnix,博主scq2099yt,地址:http://blog.chinaunix.net/uid-22312037-id-4217835.html

一、基本用法
        grep是linux中很常用的一個命令,主要功能就是進行字符串數據的對比,能使用正則表達式搜索文本,並將符合用戶需求的字符串打印出來。grep全稱是Global Regular Expression Print,表示全局正則表達式版本,它的使用權限是所有用戶。grep在數據中查找出一個字符串時,是以整行為單位來進行數據選取的。
1、命令格式
        grep [cinvs] 'patten' filename
2、主要參數
        -c:只輸出匹配行的計數。
        -i:不區分大小寫(只適用於單字符)。
        -n:顯示匹配行及行號。
        -s:不顯示不存在或無匹配文本的錯誤信息。
        -v:顯示不包含匹配文本的所有行。

    --o: 只顯示正則匹配的文本
3、patten
        要搜索的關鍵字或正則表達式語句,正則表達式參見后文。

4、簡單實例
        #netstat -nap|grep 80
        上面命令查詢監聽80端口的行。
        #grep -n "world" hello.txt
        查詢文件hello.txt中含有"world"字符串的行,並顯示行號。
        #grep -n "printf" main.c hello.c world.c
         在源碼文件main.c、hello.c和world.c中查詢調用了printf函數的行,並顯示行號。
        #grep -n "printf" *
        在當前目錄的所有文件中查詢調用了printf函數的行,並顯示行號。也可以指定路徑,比如:/usr/local/include/*。
        #grep -r "printf" *
        在當前目錄及所有子目錄下遞歸查找調用了printf函數的行,並顯示行號。
       
二、正則用法
        grep patten正則表達式主要元字符及使用如下表:

元字符

功能

例子

匹配什么

^

錨定行的開始

/^love/

匹配所有以love開頭的行

$

錨定行的結束

/love$/

匹配所有以love 結束的行

.

匹配一個字符

/l..e/

匹配這樣的行,這些行包含這樣的字符:第一個字符是l,緊跟着兩個字符,然后是e

*

代表0個或多個先前字符

/*love/

匹配所有這樣的行,有0個或多個空格,空格后跟着love

[]

匹配字符組中的一個字符

/[Ll]ove/

匹配所有包含love或者Love的行

[^]

匹配一個不在范圍內的字符

/[^A-Z]ove/

 

<

錨定單詞的開始

<love

匹配所有這樣的行,這些行包含以love開頭的單詞(vigrep支持這個功能)

>

錨定單詞的結束

Love>

匹配所有這樣的行,這些行包含以love結束的單詞(vigrep支持這個功能)

(..)

標記后面用到的匹配字符

/(love)able1rs/

最多可以使用9個標簽。第一個標簽是模板最左邊的部分。在本例子中,模板love保存的標簽為1,后面的1指得就是love;本例子搜索的是這樣的行,這些行包含這樣的字符,在Loveabel后面跟着lovers

x{m}

M次復制字符x

   

x{m,}

至少m次復制字符x

   

x{m,n}

至少m次,至多n次復制字x

   

w

文字和數字字符,[A-Za-z0-9]

Lw*e

匹配一個L字符,緊跟着0個或多個文字或數字字符,然后是e

W

同上

   

b

單詞分界線

bloveb

僅僅匹配單詞love

        簡單實例如下:
        #ls -l | grep '^a'
        通過管道過濾ls -l輸出的內容,只顯示以a開頭的行。
        #grep 'test' d*
        顯示所有以d開頭的文件中包含test的行。
        #grep '[a-z]\{5\}' aa
        顯示所有包含每個字符串至少有5個連續小寫字符的字符串的行。
        #grep 'w\(es\)t.*\1' aa
        如果west被匹配,則es就被存儲到內存中,並標記為1,然后搜索任意個字符(.*),這些字符后面緊跟着另外一個es(\1),找到就顯示該行。如果用egrep或grep -E,就不用"\"號進行轉義,直接寫成'w(es)t.*\1'就可以了。

三、其它家族
        grep家族除了有grep命令外,還包括egrep和fgrep。
        egrep是grep的擴展,支持更多的正則元字符,具體如下:

+

匹配一個或者多個先前字符

[a-z]+ove

匹配一個或者多個小寫字符且后面是ove的,

?

匹配0個或者多個先前字符

Lo?ve

匹配L后面有一個或者沒有o,然后是ve

a|b|c

匹配abc

Love|hate

匹配lovehate其中一個

()

字符組

Love(able|rs)(ov)+

匹配loveablelovers,匹配一個或多個ov

(…)(…)12

標記匹配字符串

(love)ing

標簽標記出寄存器的一部分,並稍后替換模板。該模板叫做1,並可反復引用。在表達式中最多可以使用9個這樣的標簽。例如,模板love被保存在寄存器1中並稍后替換標簽叫做1

x{m}

重復字符X,m次,至少m,或者m次和n次之間。

   

x{m,}

     

x{m,n}

     

        fgrep是fixed grep或fast grep,它把所有的字母都看作單詞,即正則元字符不再特殊,而僅僅表示其自身的字母意思。


免責聲明!

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



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