linux基本命令grep egrep fgrep用法以及正則表達式

一、基本簡介

grep (全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。

grep是很常見也很常用的命令,它的主要功能是進行字符串數據的比較,然後符合用戶需求的字符串打印出來,但是主意,grep在數據中查找一個字符串時,是以“整行”爲單位進行數據篩選的。

   egrep命令等同於grep -E,利用此命令可以使用擴展的正則表達式對文本進行搜索,並把符合用戶需求的字符串打印出來。

   fgrep命令等同於grep -F,它利用固定的字符串來對文本進行搜索,但不支持正則表達式的引用,所以此命令的執行速度也最快。


二、表達符集

^         錨定行的開始 如:'^grep'匹配所有以grep開頭的行。

$         錨定行的結束 如:'grep$'匹配所有以grep結尾的行。

.          匹配一個非換行符('\n')的字符如:'gr.p'匹配gr後接一個任意字符,然後是p。

*          匹配零個或多個先前字符 如:' *grep' (注意*前有空格)匹配所有零個或多個空格後緊跟grep的行,需要用

          egrep 或者grep帶上 -E 選項。 .*一起用代表任意字符。

[]        匹配一個指定範圍內的字符,如'[Gg]rep'匹配Grep和grep。

[^]     匹配一個不在指定範圍內的字符,如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的一個字母開頭,緊跟rep的行。

\(..\)    標記匹配字符,如'\(love\)',love被標記爲1。

\<       錨定單詞的開始,如:'\<grep'匹配包含以grep開頭的單詞的行。

\>       錨定單詞的結束,如'grep\>'匹配包含以grep結尾的單詞的行。

x\{m\}    重複字符x,m次,如:'o\{5\}'匹配包含5個o的行。

x\{m,\}   重複字符x,至少m次,如:'o\{5,\}'匹配至少有5個o的行。

x\{m,n\}    重複字符x,至少m次,不多於n次,如:'o\{5,10\}'匹配5--10個o的行。

\w     匹配文字和數字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G後跟零個或多個文字或數字字符,然後是p。

\W          \w的反置形式,匹配一個或多個非單詞字符,如點號句號等。

\b         單詞鎖定符,如: '\bgrep\b'只匹配grep。


用於egrep和 grep -E的元字符擴展集

+          匹配一個或多個先前的字符。如:'[a-z]+able',匹配一個或多個小寫字母后跟able的串,如loveable,              

            enable,disable等。

?            匹配零個或一個先前的字符。如:'gr?p'匹配gr後跟一個或沒有字符,然後是p的行。
a|b|c      匹配a或b或c。如:grep|sed匹配grep或sed
()          分組符號,如:love(able|rs)ov+匹配loveable或lovers,匹配一個或多個ov。
x{m},x{m,},x{m,n}                  作用同x\{m\},x\{m,\},x\{m,n\}


三、正則表達式

正則表達使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器裏,正則表達式通常被用來檢索、替換那些符合某個模式的文本。簡而言之,正則表達式就是處理字符串的方法,以行爲單位進行字符串的處理,通過一些特殊符號的輔助,可以讓用戶輕鬆搜索/替換某特定的字符串。

    正則表達式分爲兩類:基本的正則表達式和擴展的正則表達式。

基本的正則表達式:

爲了在不同國家的字符編碼中保持一至,POSIX(字符類)增加了特殊的字符類,如[:alnum:]是A-Za-z0-9的另一個寫法。要把它們放到[]號內才能成爲正則表達式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符類。

     (1)元字符:

          . :匹配任意單個字符

            fg:查找包含student且student後面帶一個字符的行

            grep ‘student.’ /etc/passwd (模式可以用單引號和雙引號,如果模式中要做變量替換時則必須用雙引)    

          [] :匹配指定範圍內的任意單個字符,[abc],[a-z],[0-9],[a-zA-Z]

              fg:查找帶有數字的行

              grep ‘[0-9]’ /etc/passwd

          [^] :匹配指定範圍外的任意單個字符

               fg:查找沒有小寫字母的行。

               grep ‘[^a-z]’ /etc/inittab


[:alnum:]     代表英文大小寫字符及數字,即0-9,A-Z,a-z

[:alpha:]      代表任何英文大小寫字符,即A-Z,a-z

[:blank:]      代表空格鍵與[Tab]按鍵

[:cntrl:]        代表鍵盤上面的控制按鍵,即包括CR,LF,Tab,Del等

[:digit:]        代表數字,即0-9

[:graph:]      除了空格符(空格鍵與[Tab]按鍵)外的其他所有按鍵

[:lower:]      代表小寫字符,即a-z

[:print:]       代表任何可以被打印出來的字符
[:punct:]     代表標點符號(punctuation symbol),即“ ‘ ? ! ; : # $
[:space:]     任何會產生空白的字符,包括空格鍵 [Tab] CR等
[:upper:]     代表大寫字符

[:xdigit:]     代表十六進制的數字類型,因此包括0-9,A-F,a-f的數字與字符


     (2)次數匹配:

          *  :匹配其前面的字符任意次

              fg:查找root出現0次或0次以上的行

            grep ‘root*’ /etc/passwd

           .* :任意字符

               fg:查找包含root的行

           grep 'root.*' /etc/passwd

           \?:匹配其前面的字符1次或0次

           \{m,n\} :匹配其前字符最少m,最多n次)

       (3) 字符錨定:

           ^:錨定行首,此字符後面的任意內容必須出現在行首

               fg:查找行首以#開頭的行

               grep '^#' /etc/inittab

           $:錨定行尾,此字符前面的任意內容必須出現在行尾

               fg:查找行首以root結尾的行

               grep 'root$' /etc/inittab  

           ^$:錨定空白行,可以統計空白行

           \<或者\b:錨定詞首,其後面的任意字符必須做爲單詞首部出現

              fg:查找root且root前面不包含任何字符的行

                grep '\<root' /etc/man.config

           \>或者\b:錨定詞尾,其前面的任意字符必須做爲單詞尾部出現                        

fg:\<root\> 查找root單詞  grep "\<root\>" =grep "\broot\b"

擴展的正則表達式

擴展的正則表達只是在基本的正則表達上作出了小小的一點修改,其修改如下:

在擴展的正則表達中把\( \) 寫成()、\{ \} 寫成{ },另外加入了+:次數匹配,匹配其前面的字符至少出現一次,無上限、|: 或者(二取一),其餘的都一樣, 基本正則表達式,使用( ) { } . ? |都需要轉義,在擴展正則表達中不需要加\,其詳細信息如下:

        (1) 字符匹配的命令用法基本正則表達式用法相同,這裏不再重複闡述。

        (2) 次數匹配:

            * :匹配其前面字符的任意次

            ?:匹配其前面字符的0此或着1此

            + :匹配其前面字符至少1此

                 fg:至少一個空白符: '[[:space:]]+'

            {m,n} :匹配其前面字符m到n次

         (3) 字符錨定的用法基本正則表達式用法相同,在此不再闡述。

        (4)特殊字符:

              | : 代表或者的意思。

                   fg:grep -E 'c|cat' file:表示在文件file內查找包含c或者cat

               \.:\表示轉義字符,此表示符號.

四、命令選項

-?               同時顯示匹配行上下的?行,如:grep -2 pattern filename同時顯示匹配行的上下2行。

-a, --text               等價於匹配text,用於(Binary file (standard input) matches)報錯

-b,--byte-offset             打印匹配行前面打印該行所在的塊號碼。

-c,--count               只打印匹配的行數,不顯示匹配的內容。

-f File,--file=File           從文件中提取模板。空文件中包含0個模板,所以什麼都不匹配。

-h,--no-filename              當搜索多個文件時,不顯示匹配文件名前綴。

-i,--ignore-case              忽略大小寫差別。

-o, --only-matching          只顯示正則表達式匹配的部分。(show only the part of a line matching PATTERN)

-q,--quiet            取消顯示,只返回退出狀態。0則表示找到了匹配的行。

-l,--files-with-matches             打印匹配模板的文件清單。

-L,--files-without-match             打印不匹配模板的文件清單。

-n,--line-number              在匹配的行前面打印行號。

-s,--silent             不顯示關於不存在或者無法讀取文件的錯誤信息。

-v,--revert-match            反檢索,只顯示不匹配的行。

-w,--word-regexp            如果被\<和\>引用,就把表達式做爲一個單詞搜索。

-R, -r, --recursive              遞歸的讀取目錄下的所有文件,包括子目錄。

                                         比如grep -R 'pattern' test會在 test 及其子目錄下的所有文件中,匹配 pattern。

-V,--version               顯示軟件版本信息。

五、實例

要用好grep這個工具,其實就是要寫好,所以這裏不對grep的所有功能進行實例講解,只列幾個例子,講解一個正則表達式的寫法。


$ ls -l | grep '^a'           通過管道過濾ls -l輸出的內容,只顯示以a開頭的行。

$ grep 'test' d*            顯示所有以d開頭的文件中包含test的行。

$ grep 'test' aa bb cc           顯示在aa,bb,cc文件中匹配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 '#[[:space:]]*[^[:space:]]' /etc/inittab             顯示/etc/inittab 中以#開頭,且後面跟一個或者多個空白符,

                                                                                 而後又跟了任意非空白符的行

rep '^[^0-9]' /etc/passwd                  輸出不是數字開關的行

grep '^\(1\|2\)' /etc/inittab    或    grep -E '^(1|2)' /etc/inittab                   輸出行首是1或2

grep '.*\(rc\).*\/\1.*' /etc/inittab                   查找前面是rc中間接任意字符而後跟/rc

ifconfig |grep -A 1 "^eth0" |grep "\<[0-9.]\{1,\} |cut -d: -f2               取出當前電腦上的IP

grep "^student" /etc/passwd                查找當前系統上名字爲student(必須出現在行首)的用戶賬戶的相關信                        

                                                               息,文件爲/etc/passwd


六、注意

在某些機器上,要使用-E參數才能夠進行邏輯匹配(詳見下)
grep "a|b"             (匹配包含字符樣式爲"a|b"的行)
grep -E "a|b"             (匹配包含字符樣式爲"a"或"b"的行)
詳見 man grep 裏面關於-E參數的說明

七、拓展命令  egrep   fgrep

egrep 命令,搜索文件獲得模式。

egrep 命令會在輸入文件(缺省值爲標準輸入)中搜索與用 Pattern 參數指定的模式相匹配的行。這些模式是完整的正則表達式就像在 ed 命令中的那樣(除了 \ (反斜槓)和 \\ (雙反斜槓))。下列規則也應用於 egrep 命令:
* 一個正則表達式後面帶一個 + (加號)會匹配一個或多個的正則表達式。
* 一個正則表達式後面帶一個 ? (問號)會匹配零個或一個該正則表達式。
* 由 | (豎線)或者換行符隔開的多個正則表達式會匹配與任何一個正則表達式所匹配的字符串。
* 一個正則表達式可以被包括在“()”(括弧)中進行分組。
換行符將不會被正則表達式匹配。

運算符的優先順序是 [, ], *, ?, +, 合併, | 和換行符。


注意: egrep 命令與 grep 命令帶 -E 標誌是一樣的,除了錯誤消息和使用消息不同以及 -s 標誌的功能不同之外。
egrep 命令會顯示包含該匹配行的文件,如果您指定了多於一個 File 參數的話。

對 shell 有特殊含義的字符($, *, [, |, ^, (, ), \ ) 出現在 Pattern 參數中時必須帶雙引號。如果 Pattern 參數不是簡單字符串,通常必須用單引號將整個模式括起來。在表達式中比如 [a-z],減號表示通過當前整理序列。整理序列可以定義等價的類以供在字符範圍中使用。它使用了快速確定性的算法,有時需要外部空間。


fgrep命令, 爲文件搜索文字字符串。

fgrep命令搜索 File 參數指定的輸入文件(缺省爲標準輸入)中的匹配模式的行。fgrep命令特別搜索 Pattern 參數,它們是固定的字符串。如果在 File 參數中指定一個以上的文件fgrep命令將顯示包含匹配行的文件。

fgrep命令於 grep 和 egrep 命令不同,因爲它搜索字符串而不是搜索匹配表達式的模式。fgrep命令使用快速的壓縮算法。$, *, [, |, (, ) 和 \ 等字符串被fgrep命令按字面意思解釋。這些字符並不解釋爲正則表達式,但它們在 grep 和 egrep 命令中解釋爲正則表達式。

因爲這些字符對於 shell 有特定的含義,完整的字符串應該加上單引號(‘ ... ’)。

如果沒有指定文件,fgrep命令假定標準輸入。一般,找到的每行都複製到標準輸出中去。如果不止一個輸入文件,則在找到的每行前打印文件名。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章