Linux grep,egrep及相應的正則表達式用法詳解

  linux在進行文本處理過程中的文本搜索工具稱爲正則表達式。文本搜索工具有grep、egrep、fgrep,egrep爲正則表達式的擴展正則表達式,fgrep用於搜索文本字符串,與 grep 和 egrep 命令不同,因爲它搜索字符串而不是搜索匹配表達式的模式。grep的含義爲: global search Regular expression and Print out the line

      正則表達式(REGular EXPression REGEXP)是由元字符及正常字符所書寫的模式,其中的元字符不表示字符本身的意義,而是用於表達控制或通配功能,根據用戶指定的文本模式(正則表達元字符以及正常字符組合而成)對目標文件進行逐行搜索,顯示能匹配到的行。

   首先講述的是正則表達式grep指令的用法以及一些常用的選項的應用以及簡單的示例:            

  grep [OPTIONS] PATTERN [FILE...]  

     --color=auto  自動顯示  }

                        always 有時  } 對匹配到內容是否自動顯示爲紅色

                            never   從不顯示      }

           -o:只顯示被匹配到的內容

           -iignore case ,所有的不區分字符大小寫

          -v: 顯示不能夠被模式匹配到的行

           -E :使用擴展的正則表達式

           -A # : 被模式所匹配的行以及後面#

           -B#:被模式所匹配的行以及前面#行 

           -C#:被模式所匹配的行以及前後#

示例1:顯示匹配到的字符紅色

[root@localhost ~]# grep --color=auto "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

示例2:只顯示匹配到的內容
[root@localhost ~]# grep -o --color=auto "root" /etc/passwd
root
root
root
root

 下面講的是基本正則表達式的元字符:

 字符匹配:
     . :匹配單個字符
     []:匹配指定範圍內的任意單個字符  
         例: [root@localhost ~]# grep "[Cc]a" /etc/rc.d/rc.sysinit      
         匹配出現Ca或ca,a不作爲結尾,C/c不作爲開頭,匹配Ca或者ca在文本中每行的任意位置。
   
    [^] :匹配指定範圍外的任意單個字符
    [0-9]、[[:digit:]]表示0-9中的任意的單個數字
    [^0-9]、[^[:digit:]]表示0-9範圍外的任意單個字符
    [a-z]、[[:lower:]]表示a-z中任意一個小寫字母
    [A-Z]、[[:upper:]]表示A-Z中任意一個大寫字母
    [[:space:]]表示一個空格符
    [[:punct:]]表示任意一個標點符號
    [0-9a-zA-Z]、[[:alnum:]]表示任意一個數字或字母
    [a-zA-Z]、[[:alpha:]]表示任意一個大寫字母或小寫字母  
 
  次數匹配:在期望匹配字符後面提供一個控制符,用於表達匹配前面字符指定的次數。
    * :任意次數  
例:"ab*c"   ab……bc匹配任意個b                                      abbc ,ac  可以匹配到                                                      abb, 不能匹配到                        .* : 任意長度的任意字符  (貪婪模式,會僅可能的去匹配)
   例     
   [root@localhost ~]# grep "r.*t" /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin

   \? :0次或1次 ,表示其左側字符可有可無                                                        " ab \?c "                                                                     abc ,ac 可以                                                         abbc  不可以

    \+ : 1次或多次,表示其左側字符至少出現1次;
          " ab \+c "                                                                         ac ,不可以                                                                       abc,abbbbc 可以
                                       \{m\} :m次,表示其左側字符精確出現m次;                                \{m,n\}:表示其左側字符至少出現m次,至多出現n次;                                                           "ab\{2\}c" 匹配2次 -> abbc                      
          \{0,n\} : 至多n次  "ab\{0,3\}c" 0~3次 -> ab、 abbc 、abbbc                                   \{m,\} : 至少m次      
          "ab\{1,\}c" -> ab、 abbc 、abbbc 、 ab…bc

              位置錨定:

                          ^ :錨定行首,^ PATTERN                    

                          $:錨定行尾,PATTERN$

                          ^PATTERN$ :用模式來匹配整行內容

                          ^$ :匹配空白行;

           例:用於匹配整行內容

         [root@localhost ~]# grep "^sh.*sh$" /etc/passwd

         sharang:x:5002:5002::home/sharang:/bin/tcsh

              

      單詞錨定: 由非特殊字符組成的連續的字符串                                                 

                                

          錨定單詞詞首:  \< PATTERN\b                                                                                                                                                                                   [root@localhost tmp]# grep "\<sh" /etc/passwd 

                          shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown


                      錨定詞尾: PATTERN\>PATTERN \b

                            \<PATTERN\>:匹配到PATTERN能匹配到整個單詞                                  

           例:匹配兩位數字

          [root@localhost ~]# ifconfig | grep "\<[0-9]\{2\}\>"

           eth0      Link encap:Ethernet  HWaddr 00:0C:29:5A:B6:F5  

                     inet addr:192.168.191.16  Bcast:192.168.191.255  Mask:255.255.255.0

                     inet6 addr: fe80::20c:29ff:fe5a:b6f5/64 Scope:Link

           

                   分組:\(\)

                            注意:分組中的模式,在某次的具體匹配過程中所匹配到的字符可以被grep記憶 (保存於內置的變量                 中,這些變量是 \1 , \2 ,…) 因此,還可以被引用       

                               \1 : 引用,模式自左而右,由第一次左括號以及與之對應的右括號中的模式所匹配到的內容

                               \2 :引用 ,模式中自左而右,由第二個左括號以及與之對應的右括號中的模式所匹配到的內容;

                                           \(ab\(cd\)\) \1 \2    \1匹配到ab  \2匹配到cd                   

             (1) He like his lover. 
             (2) He like his liker. 
             (3) She love her lover. 
             (4) She love her liker.

              "\(l..e\).*\1"  可以匹配上面內容



下面說下擴展的正則表達式egrep,也是通過搜索匹配表達式的模式,不過於grep的區別就是不需要添加轉義符\ ,字符匹配、次數匹配、位置錨定、分組的用法是相同的。

     字符匹配: .:匹配單個字符 

                []:匹配任意單個字符

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

     次數匹配:

                *:任意次         

             ?:0次或1次

             + :至少1次

            {m}:精確匹配m次  

          {m,n}: 至少m次,至多n次

          {m,}:至少m次

         {0,n}:至多n次

     位置錨定:

              ^: 錨定行首

             $ : 錨定行尾

         \<、\b:錨定詞首

          \>、\:錨定詞尾

         分組:    

           ():  引用爲: \1,\2...

        或者:

              a|b :a或b,或者兩側的所有內容;

              例:匹配meminfo中S或s開頭的行

              # egrep "^(S|s)" /proc/meminfo


最後的fgrep命是用來查找一個或多個與給出的字符串或詞組相匹配文件中的行。fgrep 查詢速度比grep命令快,但是不夠靈活:它只能找固定的文本,而不是規則表達式。



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