1. 程式人生 > >文字搜尋必學命令-grep egrep fgrep用法以及正則表示式

文字搜尋必學命令-grep egrep fgrep用法以及正則表示式

一、grep、egrep、fgrep命令

  本文中主要介紹了linux系統下grep egrep fgrep命令和正則表示式的基本引數和使用格式、方法。(註釋:文中fg代表例子,)

1.1、基本定義:

        grep(global search regular RE ) and print out the line,全面搜尋正則表示式並把行打印出來)是一種強大的文字搜尋工具,它只能使用基本的正則表示式來搜尋文字,並把匹配的行打印出來。

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

    egrep命令等同於grep -E,利用此命令可以使用擴充套件的正則表示式對文字進行搜尋,並把符合使用者需求的字串打印出來。

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

1.2、命令基本用法

     grep [option] '搜尋字串' filename

     grep常用選項: 

  1. -a :在二進位制檔案中,以文字檔案的方式搜尋資料 
  2. fg:在/etc/inittab內搜尋包含rc字串的行
  3. grep -a 'rc' /etc/inittab
  4. -c :計算找到'搜尋字串'的次數 
  5. -i :忽略大小寫 
  6. -v :反向查詢,即顯示沒有'搜尋字串'內容的那行 
  7. -o :只顯示被模式匹配的字串 
  8. -n :輸出行號 
  9. --colour(color):顏色顯示 
  10. -A:顯示匹配到字元那行的後面n行 
  11. -B:顯示匹配到字元那行的前面n行 
  12. -C:顯示匹配到字元那行的前後n行 

二、正則表示式

2.1、基本定義:

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

     正則表示式分為兩類:基本的正則表示式和擴充套件的正則表示式

2.2、正則表示式詳細介紹

  2.2.1、基本的正則表示式:

      (1)元字元:

  1. :匹配任意單個字元 
  2.   fg:查詢包含student且student後面帶一個字元的行 
  3.   grep ‘student.’ /etc/passwd //模式可以用單引號和雙引號,如果模式中要做變數替換時則
  4. 必須用雙引
  5. []:匹配指定範圍內的任意單個字元,[abc],[a-z],[0-9],[a-zA-Z] 
  6.    fg:查詢帶有數字的行 
  7.    grep ‘[0-9]’ /etc/passwd 
  8. [^]:匹配指定範圍外的任意單個字元 
  9.   fg:查詢沒有小寫字母的行。 
  10.   grep ‘[^a-z]’ /etc/inittab 
  11. [:space:]:表示空白字元 
  12. [:punct:]:表示所有標點符號的集合 
  13. [:lower:]:表示所有的小寫字母 
  14. [:upper:]:表示所有的大寫字母 
  15. [:alpha:]:表示大小寫字母 
  16. [:digit:]:表示數子 
  17. [:alnum:]:表示數字和大小寫字母-----使用格式[[:alnum:]]等 

    (2)次數匹配:

  1.  *  :匹配其前面的字元任意次 
  2. fg:查詢root出現0次或0次以上的行 
  3. grep ‘root*’ /etc/passwd 
  4. .* :任意字元  
  5. fg:查詢包含root的行 
  6. grep 'root.*' /etc/passwd 
  7. \?:匹配其前面的字元1次或0次 
  8. \{m,n\} :匹配其前字元最少m,最多n次) 

     (3) 字元錨定:

  1. ^:錨定行首,此字元後面的任意內容必須出現在行首 
  2.   fg:查詢行首以#開頭的行 
  3.   grep '^#' /etc/inittab 
  4. $:錨定行尾,此字元前面的任意內容必須出現在行尾 
  5. fg:查詢行首以root結尾的行 
  6. grep 'root$' /etc/inittab   
  7. ^$:錨定空白行,可以統計空白行 
  8.  \<或者\b:錨定詞首,其後面的任意字元必須做為單詞首部出現 
  9.   fg:查詢root且root前面不包含任何字元的行 
  10. grep '\<root' /etc/man.config 
  11. \>或者\b:錨定詞尾,其前面的任意字元必須做為單詞尾部出現                                  
  12. fg:\<root\> 查詢root單詞  grep "\<root\>" =grep "\broot\b" 

 2.2.2、擴充套件的正則表示式:

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

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

         (1) 字元匹配的命令和用法與基本正則表示式的用法相同,這裡不再重複闡述。

         (2) 次數匹配:

  1.  * :匹配其前面字元的任意次 
  2. :匹配其前面字元的0此或著1此 
  3.  + :匹配其前面字元至少1此 
  4. fg:至少一個空白符: '[[:space:]]+' 
  5. {m,n} :匹配其前面字元m到n次 

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

         (4)特殊字元:

  1. : 代表或者的意思。 
  2.    fg:grep -E 'c|cat' file:表示在檔案file內查詢包含c或者cat 
  3. \.:\表示轉義字元,此表示符號. 

三、grep命令利用小例項

  1. (1)顯示/etc/inittab 中以#開頭,且後面跟一個或者多個空白符,而後又跟了任意非空白符的行 
  2.  grep '#[[:space:]]*[^[:space:]]' /etc/inittab 
  3. (2) 輸出不是數字開頭的行
  4. grep '^[^0-9]’ /etc/passwd 
  5. (3)輸出行首是1或2 
  6.   grep '^\(1\|2\)' /etc/inittab或grep -E '^(1|2)' /etc/inittab 
  7. (4)查詢前面是rc中間接任意字元而後跟/rc 
  8.   grep '.*\(rc\).*\/\1.*' /etc/inittab 
  9. (5)取出當前電腦上的IP 
  10.   ifconfig |grep -A 1 "^eth0" |grep "\<[0-9.]\{1,\} |cut -d: -f2 
  11. (6)查詢當前系統上名字為student(必須出現在行首)的使用者賬戶的相關資訊,檔案為/etc/passwd 
  12.    grep "^student" /etc/passwd 
  13. (7)顯示/proc/meminfo檔案中以不區分大小寫的s開頭的行
  14. grep -i '^s' /proc/meminfo或者 grep '^[sS]' meminfo
  15. (8) 顯示/etc/inittab 中以#開頭,且後面跟一個或者多個空白符,而後又跟了任意非空白符的行
  16. grep '^#[[:space:]]*[^[:space:]]' /etc/inittab
  17. (9) 顯示/boot/grub/grub.conf檔案中以一個或者多個空白符開頭的行
  18. grep '^[[:space:]]\{1,\}' /boot/grub/grub.conf
  19. (10)顯示/etc/inittab檔案中以一個數字開頭並以一個與開頭數字相同的數字結尾的行
  20. grep '^\([0-9]\).*\1$' /etc/inittab 或者 grep '^\([[:digit:]]\).*\1$' /etc/inittab
  21. (11)找出ifconfig命令結果中的1-255之間的整數
  22. ifconfig | egrep '\b[0-9][0-9]\b?|\b1[0-9][0-9]\b|\b2[0-4][0-9]\b|\b25[0-5]\b' --color