shell之正則表達式

一 正則表達式git

    正則表達式:描述某些字符串匹配規則的工具正則表達式

    使用緣由:程序設計過程當中不可避免的遇處處理某些文本狀況,有時候要查找符合某些比較複雜規則的字符串。正則表達式以很是簡單的代碼完成。shell

    常見的支持正則表達式的UNIX工具:vim

        grep命令族:用於匹配文本行bash

        sed流編輯器:用於改變輸入流less

        awk:用於處理字符串的語言ssh

        more或者less等:文件查看程序編輯器

        ed,vi或者vim等:文本編輯器函數

    實踐正則表達式:工具

    #! /bin/bash

    str=`catversion.txt|grep rev`

    echo"$str"

    (cat命令用來顯示文本內容,豎線是管道,表示將cat命苦的輸出結果做爲後面的那個命令的輸入,grep命令用來查找文本,rev指要匹配的字符串。上面執行結果表示version.txt文件中的某一行含義rev這個字符串,實際上,grep命令後面的參數能夠換成任意的正則表達式)

1.1 正則表達式原理

    正則表達式是對文本進行過濾的工具,之因此有過濾文本的功能,由於它定義了一系列的元字符,經過元字符配合其餘字符來表達出一種規則。只有符合該規則的文本才能保留下來。

    元字符:描述字符的字符。

    元字符做用:對錶達式的內容,轉換以及各類操做信息進行描述。


 1.2  基本正則表達式

    又稱標準正則表達式,僅支持最基本的元字符集。

    基本正則表達式定義的元字符主要有:

     1)行首定位符 「^」

    用來匹配行首的字符。表示行首的字符是^後面的那個字符。

    行首定位符位於所做用的字符以前

    例如:

    #列出/etc目錄中的以字母po開頭的文件名

    str=`ls /etc |grep "^po"`

    echo"$str"

    (^po理解爲第一個字符爲p,緊跟着一個字母o的文本行。不要理解爲字符串po開頭的文本行。)      

     2)行尾定位符」$」

    做用:定位文本行的末尾。

    行尾定位符位於所做用的字符以後。

    #列出/etc目錄中以conf結尾的文件名

    str=`ls /etc |grep "conf$"`

    echo"$str"

    結果:anthy-conf

           asound.conf

     注意:

    精確匹配一個文本行:^cat$ 徹底匹配cat的文本行

    ^$:匹配全部空行

    單獨的^和$沒有任何意義,由於任何一個文本行都有開頭和結尾。

     3)單個字符匹配」.」

    圓點.用來匹配任意單個字符。包括空格,但不包括換行符\n。當使用」.」後,意味着該位置必定有一個字符,不管他是什麼字符。

    例:

    #列出全部的包含字符串「samba」的文件名,無論samba後面有沒有字符

    str=`ls /etc |grep "samba"`

    echo"$str"

    echo"==============================="

    #列出包含字符串samba,且samba後面只是含義一個字符

    str=`ls /etc |grep "samba."`

    echo"$str"

    結果:samba

          samba4

    ======================

    samba4

    (能夠連續使用..來匹配多個字符,如l..p,匹配含義字母l,而後是兩個任意字符,再接着是字母p的字符串)       

     4) 限定符「*」

    限定符自己不表明任何字符,用來指定其前面的一個字符必須重複出現屢次才能知足匹配。而星號表示匹配其前導字符的任意次數,包括0次

    #篩選出以字符s開頭,緊跟着1個字符s,再接着任意個字符s的文件名

    str=`ls /etc |grep "^sss*"`

    echo"$str"

    結果:ssh

            ssl

            sssd

     5) 字符集匹配「[]」

    只要某個字符串在方括號所在的位置上出現了方括號中的任意一個字符,就知足匹配規則。

    對於連續的數字或字母,可以使用連字符-來表示一個範圍。

    如:[a-f]表示匹配a到f中的任意一個字母

    [0-9]匹配任意單個數字

    #篩選全部以字符r開頭,而且緊跟着1個字符c的文本行

    str=`ls /etc |grep "^rc"`

    echo "$str"

    echo "=============================="

    #篩選全部以字符r開頭,緊跟着1個字符爲c,下面1個字符爲單個數字的文本行

    str=`ls /etc | grep "^rc[0-9]"`

    echo "$str"

     6)字符集不匹配「[^]」

 1.3  擴展正則表達式

    (egrep命令默認使用擴展正則表達式)

    1 )限定符「+」

    「+」限定前面的字符至少出現一次。

    #篩選以字符串「ss」開頭,後面至少緊跟着1個字符「s」的文本行

    str=`ls /etc |egrep "^sss+"`

    echo"$str"

    結果:sssd

     2)限定符「?」

    限定前面的字符最多隻出現一次。

    #篩選以字符串「ss」開頭,後面跟着0或者1個s的文本行

    str=`ls /etc |egrep "^sss?"`

    echo"$str"

    結果:ssh,ssl,sssd

     3)豎線「|」和圓括號「()」

    豎線|表示多個正則表達式以前或的關係

    圓括號表示一組可選值得集合。

    豎線和圓括號常常一塊兒使用,表示一組可選值。

    #篩選含有字符串「ssh」、「ssl」或者以字符串「yum」開頭的文本行

    str=`ls /etc |egrep "(ssh|ssl|^yum)"`

    echo"$str"

1.4 Perl正則表達式

    1)數字匹配\d

    2)非數字匹配\D

    3)空白字符匹配\s

    4)非空白字符匹配\S

1.5正則表達式應用

    匹配單個字符

        1 單個通常字符

        英文字符,數字,空白字符以及標點符號

        #搜索demo2.txt含有字符「a」的文本行

        str=`grep"a" demo2.txt`

        echo"$str"

         2 轉義後的元字符

        要匹配元字符自己,須要在這些字符的前面加上\,關閉這些元字符的特殊意義,保留其字面意義。

        反斜線也是一個元字符,若是要匹配,也要加\,即表達式「\\」表示匹配一個反斜線。

         3 方括號表達式

        當元字符位於方括號中時,除了連字符-或者^以外,其餘元字符都會失去特殊意義。如:

        [\.]表示的是反斜線\和圓點.這兩個字符。若是要匹配圓點,[.]就能夠了。

     

    匹配多個字符

        1 將多個字符按照指定順序拼接起來

        #搜索字符串「matter」

        str=`grep"matter" demo3.txt`

        echo"$str"

        2 方括號或星號等配合

        #匹配任意多個字符「o」

        str=`grep"lo*king" demo3.txt`

        echo"$str"

        例子:篩選符合指定格式的電話號碼

        #篩選符合格式的電話號碼

        str=`egrep"800-[[:digit:]]{3}-[[:digit:]]{4}$" demo4.txt`

        echo"$str"

 1.6 正則表達式優先級

    \   轉義符

    []  方括號表達式

    ()   分組

    *,+?{m},{m,},{m,n}  限定符

    普通字符  從左到右順序

    ^,$ 定位符

    |   或運算

    (從高到低)

 

1.7 子表達式

    由多個普通字符或者元字符組成的一個小的正則表達式。做爲一個大的正則表達式的一部分使用,不能單獨使用。使用圓括號括起來。

    例子:匹配IP地址

    #匹配IP地址

    str=`egrep"^([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}$" ip.txt`

    echo"$str"

    (子表達式表示匹配1-3個數字,而後是一個圓點。整個表達式描述的字符串以3組重複的1-3個數字後跟一個圓點開頭,而後以1-3個數字結尾)

    精確匹配IP地址:

    #匹配正確IP地址

    str=`egrep"^([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"ip.txt`

    echo"$str"

 1.8 通配符

    shell自己不支持正則表達式,使用正則表達式的是shell命令和工具。

    shell使用了正則表達式中的某些元字符做爲通配符,經常使用的有*,?,[],{},^等。但意義有所不一樣。

    如:*表示匹配任意的字符,在非正則表達式中限制其前導字符的0次或屢次重複。

    例:

    列出以ex開頭的當前目錄中全部的文件:ls–l ex*

    列出以字符d或e開頭的文件:ls –l [de]*

1.9 grep命令

    grep命令使用正則表達式來搜索文本,而且把匹配的文本打印出來。

    grep [options]pattern [file]

    option表示選項,pattern表示匹配的模式。file表示一系列文件名。

    經常使用選項:

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

    -i   匹配時忽略字母大小寫

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

    -l   只列出含義匹配的文本行的文件的文件名,不顯示其具體匹配的內容。

    -n  列出全部匹配的文本行,並顯示行號

    -s   不顯示關於不存在或沒法讀取文件的錯誤信息

    -v   只顯示不匹配的文本行。

    -w  匹配整個單詞

    -x   匹配整個文本行

    -r   遞歸搜索,不只搜索當前目錄,還有各級子目錄

相關文章
相關標籤/搜索