Linux egrep在文件內查找指定的字符串命令詳解

grep、fgrep 和 egrep 命令 比較git

grep的通常格式爲:web

    grep [選項] 基本正則表達式 [文件]正則表達式

  在grep命令中輸入字符串參數時,最好將其用雙引號括起來。例如:「my strings」,這樣作有兩個緣由,一個是防止被誤會是shell命令,一個是能夠用來查找多個單詞組成的字符串,就如這個例子中的「my strings」。
  在調用變量的時候,也應該使用雙引號,例如:grep 「$MYNAME」。
  在調用模式匹配時,應該使用單引號。shell

  grep命令中的經常使用選項:
    -c 只輸出匹配的行數。
    -i 不區分大小寫。
    -h 查詢多個文件時不顯示文件名。
    -l 查詢文件時只顯示匹配字符所在的文件名。
    -n 顯示匹配的行及其行號。
    -s 不顯示不存在或不匹配文本的錯誤信息。
    -v 顯示不匹配的全部行。
    -E 容許使用擴展模式匹配。例如:grep -E ’00|04′ findfile,表示在findfile文件中查詢包含00或04的行。express

  grep容許使用國際字符模式匹配。類名及其等價的正則表達式:
    類 正則表達式
    [[:upper:]] [A-Z]
    [[:lower:]] [a-z]
    [[:digit:]] [0-9]
    [[:alnum:]] [0-9a-zA-Z]
    [[:space:]] 空格或tab鍵
    [[:alpha:]] [a-zA-Z]
grep、fgrep和egrep命令
  這組命令以指定模式搜索文件,並通知用戶在什麼文件中搜索到與指定的模式匹配的字符串,並打印出全部包含該字符串的文本行,在該文本行的最前面是該行所在的文件名。grep命令一次只能搜索一個指定的模式;egrep命令檢索擴展的正則表達式(包括表達式組和可選項);fgrep命令檢索固定字符串,它不識別正則表達式,是快速搜索命令。
  這組命令在搜索與定位文件中特定的主題方面很是有用。要搜索的模式能夠被認爲是一些關鍵詞,您能夠用它們來搜索文件中包含的這些關鍵詞。編寫程序時,能夠用它來尋找某一個函數,或是相關的詞組。grep命令的搜索功能比fgrep強大,由於grep命令的搜索模式能夠是正則表達式,而fgrep卻不能。有關正則表達式請參見shell一章。
  該組命令中的每個命令都有一組選項,利用這些選項能夠改變其輸出方式。例如,能夠在搜索到的文本行上加入行號,或者只輸出文本行的行號,或者輸出全部與搜索模式不匹配的文本行,或只簡單地輸出已搜索到指定模式的文件名,而且能夠指定在查找模式時忽略大小寫。
  這組命令在指定的輸入文件中查找與模式匹配的行。若是沒有指定文件,則從標準輸入中讀取。正常狀況下,每一個匹配的行被顯示到標準輸出。若是要查找的文件是多個,則在每一行輸出以前加上文件名。
  語法:
  grep [選項] [查找模式] [文件名1,文件名2,……]
  egrep [選項] [查找模式] [文件名1,文件名2,……]
  fgrep [選項] [查找模式] [文件名1,文件名2,……]
  這組命令各選項的含義爲:
  - E 每一個模式做爲一個擴展的正則表達式對待。
  - F 每一個模式做爲一組固定字符串對待(以新行分隔),而不做爲正則表達式。
  - b在輸出的每一行前顯示包含匹配字符串的行在文件中的字節偏移量。
  - c 只顯示匹配行的數量。
  - i 比較時不區分大小寫。
  - h 在查找多個文件時,指示grep不要將文件名加入到輸出以前。
  - l 顯示首次匹配串所在的文件名並用換行符將其隔開。當在某文件中屢次出現匹配串時,不重複顯示此文件名。
  - n 在輸出前加上匹配串所在行的行號(文件首行行號爲1)。
  - v 只顯示不包含匹配串的行。
  - x 只顯示整行嚴格匹配的行。
  - e expression 指定檢索使用的模式。用於防止以「-」開頭的模式被解釋爲命令選項。
  - f expfile 從expfile文件中獲取要搜索的模式,一個模式佔一行。
  對該組命令的使用還需注意如下方面:
  編程

  • 在命令後鍵入搜索的模式,再鍵入要搜索的文件。其中,文件名列表中也可使用特殊字符,如「*」等,用來生成文件名列表。若是想在搜索的模式中包含有空格的字符串,能夠用單引號把要搜索的模式括起來,用來代表搜索的模式是由包含空格的字符串組成。不然,Shell將把空格認爲是命令行參數的定界符,而 grep命令將把搜索模式中的單詞解釋爲文件名列表中的一部分。在下面的例子中,grep命令在文件example中搜索模式「text file」。函數

  •   

    1. $ grep ’text file’ example工具

       用戶能夠在命令行上用Shell特殊字符來生成將要搜索的文件名列表。在下面的例子中,特殊字符「*」用來生成一個文件名列表,該列表包含當前目錄下全部的文件。該命令將搜索出當前目錄下全部文件中與模式匹配的行。
      $ grep data *
       spa

  • 特殊字符在搜索一組指定的文件時很是有用。例如,若是想搜索全部的C程序源文件中特定的模式,您能夠用「*.c」來指定文件名列表。假設用戶的 C程序中包含一些沒必要要的轉向語句(goto語句),想要找到這些語句,能夠用以下的命令來搜索並顯示全部包含goto語句的代碼行:命令行

  •   

    1. $ grep goto *.c

      

  • 用戶能夠在命令行上鍵入搜索模式,也可使用-f選項從指定文件中讀取要搜索的模式。在文件中,每一個搜索模式佔一行。若是常常要搜索一組常見字符串時,這個功能很是有用。在下面的例子中,用戶要在文件exam中搜索字符串「editor」和「create」,就把要搜索的模式放置在文件mypats 中,而後,grep命令從文件mypats中讀取要搜索的模式。

  •   

    1. $ cat mypats

    2.   editor

    3.   create

    4.   $ grep -f mypats exam

    grep的使用詳解一

    1. # cat zhao.conf(顯示咱們所查文件的內容)

    48 Dec 3BC1997 LPSX 68.00 LVX2A 138
    483 Sept 5AP1996 USP 65.00 LVX2C 189
    47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
    219 dec 2CC1999 CAD 23.00 PLV2C 68
    484 nov 7PL1996 CAD 49.00 PLV2C 234
    487 may 5PA1998 USP 37.00 KVM9D 644
    471 May 7Zh1999 UDP 37.00 KV30D 643

    1. # grep -c "48" zhao.conf(統計全部以「48」字符開頭的行有多少


    4

    1. # grep -i "May" zhao.conf(不區分大小寫查找「May」全部的行)

    487 may 5PA1998 USP 37.00 KVM9D 644
    471 May 7Zh1999 UDP 37.00 KV30D 643

    1. # grep -i "may" zhao.conf

    487 may 5PA1998 USP 37.00 KVM9D 644
    471 May 7Zh1999 UDP 37.00 KV30D 643

    1. # grep -n "48" zhao.conf(顯示行號;顯示匹配字符「48」所在的行的行號)

    1:48 Dec 3BC1997 LPSX 68.00 LVX2A 138
    2:483 Sept 5AP1996 USP 65.00 LVX2C 189
    5:484 nov 7PL1996 CAD 49.00 PLV2C 234
    6:487 may 5PA1998 USP 37.00 KVM9D 644

    1. # grep -v "48" zhao.conf(顯示輸出沒有字符「48」全部的行)

    47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
    219 dec 2CC1999 CAD 23.00 PLV2C 68
    471 May 7Zh1999 UDP 37.00 KV30D 643

    1. # grep "471"  zhao.conf(顯示輸出字符「471」所在的行)

    471 May 7Zh1999 UDP 37.00 KV30D 643

    1. # grep "48\>" zhao.conf(精確顯示輸出字符「48」所在的行)

    48 Dec 3BC1997 LPSX 68.00 LVX2A 138

    1. # grep "48<tab>" zhao.conf(顯示輸出以字符「48」開頭,並在字符「48」後是一個tab鍵所在的行

    注:tab鍵,安一下tab鍵便可;和精確顯示輸出的結果是相同的)
    48 Dec 3BC1997 LPSX 68.00 LVX2A 138

    1. # grep "48[34]" zhao.conf(顯示輸出以字符「48」開頭,第三個字符是「3」或是「4」的全部的行)

    483 Sept 5AP1996 USP 65.00 LVX2C 189
    484 nov 7PL1996 CAD 49.00 PLV2C 234

    1. # grep '48[34]' zhao.conf(注意使用單引號(&lsquo;’)和使用雙引號(「」)在Solaris8中輸出的結果是同樣的;

    即:單引號、和雙引號是通用的,只要你養成一種習慣就好)
    483 Sept 5AP1996 USP 65.00 LVX2C 189
    484 nov 7PL1996 CAD 49.00 PLV2C 234

    1. # grep "^[^48]" zhao.conf(顯示輸出行首不是字符「48」的行)

    219 dec 2CC1999 CAD 23.00 PLV2C 68

    1. # grep "[Mm]ay" zhao.conf(設置大小寫查找:顯示輸出第一個字符以「M」或「m」開頭,以字符「ay」結束的行)

    487 may 5PA1998 USP 37.00 KVM9D 644
    471 May 7Zh1999 UDP 37.00 KV30D 643

    1. # cat zhao.conf(再次顯示咱們所使用的文件的內容)

    48 Dec 3BC1997 LPSX 68.00 LVX2A 138
    483 Sept 5AP1996 USP 65.00 LVX2C 189
    47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
    219 dec 2CC1999 CAD 23.00 PLV2C 68
    484 nov 7PL1996 CAD 49.00 PLV2C 234
    487 may 5PA1998 USP 37.00 KVM9D 644
    471 May 7Zh1999 UDP 37.00 KV30D 643

    1. # grep "K...D" zhao.conf(顯示輸出第一個字符是「K」,第2、3、四是任意字符,第五個字符是「D」所在的行)

    47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
    487 may 5PA1998 USP 37.00 KVM9D 644
    471 May 7Zh1999 UDP 37.00 KV30D 643

    1. # grep "[A-Z][A-Z][A-Z][9]D" zhao.conf(顯示輸出第一個字符的範圍是「A-D」,第二個字符的範圍是「A-D」,

    2. 第三個字符的範圍是「A-D」,第四個字符是「9」,第五個字符的是「D」,全部的行:已知所查字符串的長度爲5位)

    47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
    487 may 5PA1998 USP 37.00 KVM9D 644
    # grep 「5..1998」 zhao.conf
    487 may 5PA1998 USP 37.00 KVM9D 644

    1. # grep "[35]..1998" zhao.conf(顯示輸出第一個字符是「3」或「5」,第2、三個字符是任意,以1998結尾的所

    2. 有行;已知所查字符串的長度是7位)

    47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
    487 may 5PA1998 USP 37.00 KVM9D 644
    #

    1. # grep "4\{2,\}" zhao.conf(模式出現概率查找:顯示輸出字符「4」至少重複出現兩次的全部行)

    487 may 5PA1998 USP 37.00 KVM9D 644

    1. # grep "9\{3,\}" zhao.conf(模式出現概率查找:顯示輸出字符「9」至少重複出現三次的全部行)

    219 dec 2CC1999 CAD 23.00 PLV2C 68
    471 May 7Zh1999 UDP 37.00 KV30D 643

    1. # grep "9\{2,3\}" zhao.conf(模式出現概率查找:顯示輸出字符「9」重複出現的次數在必定範圍內(重複出現2

    2. 次或3次)全部行)

    48 Dec 3BC1997 LPSX 68.00 LVX2A 138
    483 Sept 5AP1996 USP 65.00 LVX2C 189
    47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
    219 dec 2CC1999 CAD 23.00 PLV2C 68
    484 nov 7PL1996 CAD 49.00 PLV2C 234
    487 may 5PA1998 USP 37.00 KVM9D 644
    471 May 7Zh1999 UDP 37.00 KV30D 643

    1. # grep -n "^$" zhao.conf(顯示輸出空行的行號)

    grep的使用二

    1. # ls -l | grep "^d"(僅列出當前目錄下的全部目錄)

    drwxr-xr-x 2 root other 512 11月 25 22:41 ldap
    #

    1. # ls -l | grep"^[^d]"(僅列出當前目錄下的全部文件)

    -rw-r–r– 1 root other 4987 11月 25 23:22 grep.log
    -rw-r–r– 1 root other 0 11月 26 22:34 grep.log2
    -rw-r–r– 1 root other 267 11月 19 19:37 ifconfig
    #

    1. # ls -l|grep "^d.....x..x"(僅列出當前目錄下符合「d.....x..x」權限的目錄)

    drwxr-xr-x 2 root other 512 11月 25 22:41 ldap
    #

    1. # grep "mailsrv" /etc/passwd(抽出/etc/passwd中「mailsrv」的用戶信息)

    mailsrv:x:101:3:iplanet mail user:/iplanet/server5/bin/msg/admin/bin:/bin/sh
    #

    1. # grep "mailsrv" /etc/passwd >mailuser.log

    # (抽出/etc/passwd中「mailsrv」的用戶信息輸出到一個文件(mailsrv.log)中)

    1. # more mailuser.log

    mailsrv:x:101:3:iplanet mail user:/iplanet/server5/bin/msg/admin/bin:/bin/sh
    #

    1. # ps -ef|grep telnet(在顯示的進程中抽出「telnet」進程)

    root 321 165 0 22:29:33 ? 0:00 in.telnetd
    root 638 434 0 23:35:38 pts/1 0:00 grep telnet

    1. # ps -ef|grep telnet | grep -v grep (在顯示的進程中抽出「telnet」進程;並丟棄ps中的grep進程)

    root 321 165 0 22:29:33 ? 0:00 in.telnetd
    #

    1. # ps -ef|grep -v telnet(將抽出除「telnet」以外的全部進程)

    2. # cat zhao.conf(再來看一下咱們使用的文件內容)

    48 Dec 3BC1997 LPSX 68.00 LVX2A 138
    483 Sept 5AP1996 USP 65.00 LVX2C 189
    47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
    219 dec 2CC1999 CAD 23.00 PLV2C 68
    484 nov 7PL1996 CAD 49.00 PLV2C 234
    487 may 5PA1998 USP 37.00 KVM9D 644
    471 May 7Zh1999 UDP 37.00 KV30D   643

    1. # egrep "(3ZL|2CC)" zhao.conf(使用egrep來抽取文件(zhao.conf)中前三個字符匹配「3ZL」或「2CC」的行)

    47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
    219 dec 2CC1999 CAD 23.00 PLV2C 68

    1. # grep "48" zhao.conf |wc(使用grep抽取文件(zhao.conf)中前兩個字符匹配「48」的行,並統計出有幾行匹配,有多少個

    2. 字,這些字佔用多少字節的空間)

    4 28 224
    在UNIX中字處理是一件很煩瑣的事情,但這些字處理工具給咱們帶來了很大的方便;這裏grep、egrep(擴展grep,在一些UNIX中
    也存在)僅僅是一種工具。但其能靈活的抽出你須要的東東。它將隨着你對UNIX的理解程度,逐步變成你手頭不可缺乏的一個工具
    其在shell編程中一樣具備舉足輕重的位置。grep、egrep和其餘字處理工具的組合使用更爲靈活、深澳!

    ————–

    grep能找出帶有關鍵字的行,可是工做中有時須要找出該行先後的行,下面是解釋

    1. 1. grep -A1 keyword filename

    找出filename中帶有keyword的行,輸出中除顯示該行外,還顯示以後的一行(After 1)

    1. 2. grep -B1 keyword filename

    找出filename中帶有keyword的行,輸出中除顯示該行外,還顯示以前的一行(Before 1)

    1. 3. grep -1 keyword filename

    找出filename中帶有keyword的行,輸出中除顯示該行外,還顯示以前的一行(After 1)和顯示以後的一行(After 1)

相關文章
相關標籤/搜索