正則表達式詳解和案例

    正則表達式是通過一些特殊符號的排列,用以查找、替換、刪除一行或者多行文字字符串。對於程序來說,更加重要的用途是驗證字段的合法性。本文介紹Linux和常用程序的正則表達式的使用。


一、Linux中grep工具的介紹和簡單使用

    grep [option] ‘正則’ filename

     -i :忽略要匹配內容的大小寫 

    -n:輸出匹配到行的行號

     -o:僅顯示匹配的字串,而非字串所在的行

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

    如:匹配/etc/test.txt中含有test的字符串

    grep test /etc/test/txt


如:匹配/etc/passwd下含有root這個字符串信息的用戶信息,並顯示匹配到的信息所在的行 

    [root@MyTesting /]# grep -n root /etc/passwd 
    1:root:x:0:0:root:/root:/bin/bash 
    11:operator:x:11:0:operator:/root:/sbin/nologin


二、基本的正則表達式匹配

(1)特殊符號表示正則,如下常用匹配內容。

         Linux中所支持的匹配

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

         [[:lower:]] 代表小寫字母a-z

         [[:upper:]] 代表大寫字母A-Z

         [[:space:]] 代表空格,包括tab

         [[:punct:]] 代表標點符號

         [[:alpha:]] 代表任何英文字母,a-z和A-Z

         [[:alnum:]] 代表任何英文字母和數字


         常用編程語言所支持的匹配

         \d 代表數字0-9

         \D 代表非數字0-9

         \w 代表任何英文字母和數字,包括下劃線

         \W 代表非任何英文字母和數字,包括下劃線

         \s 代表任何空白字符

         \S 代表非空白字符

         \b 代表單詞的邊界

         \B 代表非單詞的邊界

         \n 代表一個換行符

         \r 代表一個回車符


     例如:

     把/etc/passwd下的含有大寫字母的行列出來

        grep --color '[[:upper:]]' /etc/passwd

    wKiom1X9mrHTCBU0AAMn4u_xl3o690.jpg   


(2)特俗符號匹配

     1、字符匹配

         []:表示範圍內的匹配,如匹配0-9範圍,則可表示爲[0-9]

         .:表示任意單個字符


     2、次數匹配

         *:表示任意長度次數的匹配,.*則表示任意長度的任意字符,可以匹配任何內容

         如:

    grep --color 'r.*t' /etc/passwd

        wKioL1X9nQeSj0xQAAHTMJ5Sbd4667.jpg

    

    \?:匹配0次或者1次

     如:

    grep --color 't\?' /etc/passwd

    wKioL1X9nTm***YRAAHB_qvtim0588.jpg    


     有沒有匹配到t的行都顯示出來


     \+:匹配一次以上

     如:

    grep --color 't\+' /etc/passwd

    wKioL1X9nWHgUo_OAAHoM_FgkR4927.jpg

    

     只有匹配到有t的行纔會被顯示出來

    

     {m}:精確匹配m次,如{2},精確匹配2次

     {m,n}:至少匹配m次,至多匹配n次,如{1-10},出現1-10次都會被匹配到

     {m,}:匹配m次以上,如{3,},出現3次以上纔會被匹配到

     {0,n}:至多匹配n次,如{0,3},出現3次以下的纔會被匹配到

     如:匹配 /etc/passwd中,出現4位數字以上的行

    grep --color '[[:digit:]]\{4,\}' /etc/passwd

    wKiom1X9m13g02psAAEvuyxCoas134.jpg


(3)位置錨定

     ^:匹配首部

     $:匹配尾部

     \<:匹配單詞開始,可以用\b代替

     \>:匹配單詞結束,可以用\b代替

     ^$:匹配空白行

    

     如:匹配 /etc/passwd中,首部出現root的行

    grep --color '^root' /etc/passwd

    wKiom1X9m3uABWPfAAC1v9S0ieU327.jpg


(4)分組

     ():表示分組

     如:匹配 /etc/passwd中,用戶爲root或者bin的行

    grep --color '^\(root\|bin\)' /etc/passwd

    wKioL1X9nd2T08e8AAB7kweQPy4693.jpg


(5)後項引用

     後項引用是指引用分組裏面匹配到的內容。

     如第一個括號分組匹配到的內容,用\1表示

     如:匹配/etc/passwd中開頭爲root,之後又出現root的行。

    grep -E  --color '^(root).*\1' /etc/passwd

    wKiom1X9m8DxIPb3AABTdyxCUwc122.jpg


三、擴展正則表達式

    擴展正則表達式跟基本表達式差不多,基本匹配語法爲:

     grep -E ‘正則’ filename 或者

     egrep ‘正則’ filename

    

     所支持元字符如下:

     .:表示任意字符

      []:表示符合中括號內的範圍字符

     [^]:表示匹配非中括號範圍內的字符

      *:表示匹配任意次

     ?:表示匹配0次或1次

     +:表示至少匹配1次

     {m}:表示精確匹配m次

     {m,n}:表示至少匹配m次,至多匹配n次

     {m,}:表示匹配m次或以上

     {0,n}:表示最多匹配n次

     ^:表示開頭匹配

     $:表示結尾匹配

     \<,\b:表示匹配開頭單詞

     \>,\b:表示匹配結尾單詞

     ^$,^[[:space:]]*$:表示匹配空白字符

      ():表示匹配分組,匹配括號內的整個字符串內容

     \1,\2,\3:表示引用分組分別爲第1,2,3個的內容


四、常用正則表達式匹配

(1)找出/etc/rc.d/init.d/functions文件中某單詞後跟一組小括號“()”行

     grep -o -E "\<[[:alnum:]]+\>\(\)" /etc/rc.d/init.d/functions

    wKiom1X9m9-htnHoAACoCoqwlac995.jpg


(2)使用echo命令輸出一個路徑,而後使用grep取出其基名。如/etc/sysconfig,取基名則爲sysconfig

    echo '/etc/sysconfig/' | grep -o -E "[[:alnum:]]+/?$" | cut -d/ -f1

    wKioL1X9noqgjYW8AAEcJlvl3W8622.jpg


(3)找出ifconfig命令結果中的1-255之間的數字

    ifconfig | grep -o -E "[[:digit:]]|[[:digit:]][[:digit:]]|2[0-4][[:digit:]]|25[[:digit:]]

     wKiom1X9nG_h1HJRAACMteadcog242.jpg


(4)寫一個模式,能匹配合理的ipv4地址

    ifconfig | grep -o -E "([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-3][0-9])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"

    wKiom1X9nLDj0BqaAAD8Akf3pok532.jpg









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