1. 程式人生 > >Linux的正則表達式

Linux的正則表達式

Linux 正則表達式 Linux通配符

什麽是正則表達式?
  • 正則表達式是用於描述字符排列和匹配模式的一種語法規則。它主要用於字符串的模式分割、匹配、查找及替換操作。

正則表達式與通配符

  • 正則表達式用來在文件中匹配符合條件的字符串,正則的包含匹配。
  • 通配符用來匹配符合條件的文件名,通配符的完全匹配。

正則表達式

字符匹配符號

     .:  匹配任意單個字符;

    []: 匹配指定範圍內的任意單個字符;如coo[kl]匹配cook或cool  

    [^]:匹配指定範圍外的任意單個字符;如9[^01]匹配92、93、94等,但是不能匹配91或90

    [-] 匹配[]中指定範圍內的任意一個字符;如[a-f]匹配從a到f之間的小寫字母 

    大寫 [[:upper:]] 或 [A-Z]

    小寫 [[:lower:]] 或 [a-z]

    字母 [[:alpha:]] 或 [a-Z]  

    字母 數字[[:alnum:]] 

    空格或者制表符 [[:blank:]]

    純數字 [[:digit:]] 或 [0-9]

    標點符號 [[:punct:]]

?

匹配次數符合:用在要指定次數的字符後面,用於指定前面的字符要出現的次數;

         *:匹配前面的字符任意次;

        .*:任意長度的任意字符;

        \?:匹配其前面的字符出現0或1次;即前面的可有可無

        \+:匹配其前面的字符出現至少1次;如ro9+匹配ro9或ro99或ro999等

        \{m\}:匹配前面的字符出現m次;如[0-9]{3}匹配任意一個三位數,[0-9]{3}可以擴展為[0-9][0-9][0-9]

        \{m,n\}:匹配前面的字符出現至少m次,最多n次;

        \{0,n\}:匹配前面的字符出現最多n次;

        \{m,\}:匹配前面的字符出現至少m次;如[0-9]\{1,\}匹配任意一個兩位或更多位的數字

位置錨定符號:

        ^:行首錨定;用於模式的最左側;

        $:行尾錨定;用於模式的最右側;

        ^PATTERN$: 用於模式匹配整行;

        ^$: 空行;

        ^[[:space:]]*$

        \< 或 \b:詞首錨定;用於單詞模式的左側;

        \> 或 \b:詞尾錨定;用於單詞模式的右側;

        \<PATTERN\>:匹配整個單詞;

分組:

\(\):將一個或多個字符捆綁在一起,當作一個整體進行處理;
            \(xy\)*ab

分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些變量的命名方式為: \1, \2,...
    \1: 從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符;
            \(ab\+\(xy\)*\):
                \1:表示第一的()裏的內容 ab\+\(xy\)*
                \2:表示第二的()裏的內容 xy

支持後向引用:引用前面的分組括號中的模式所匹配字符,(而非模式本身)

其他符號規則

    ..  匹配任意兩個字符

    |   匹配|兩邊的任意一項,如oc(mm|nn)匹配ocmm或ocnn

    \   轉義符可以將上面介紹的特殊字符進行轉義,如a\.b匹配a.b但不能匹配ajb。通過在.之前加上\從而忽略了.的特殊意義

?


來些示例

[root@anuo ~]# cat test 
root
Root
rot
boot
Rot
111
222
,123
.456
 haha
    hello
A1234
A123
A12
A1
A

1、查找A後有0到多個數字

[root@anuo ~]# egrep A[0-9]* test   --*表示前一個字符有0個或多個
A1234
A123
A12
A1
A

2、查找A後有1到多個數字,所以相對於上面的顯示,最後一行沒有了(等同於egrep -n "A[0-9]+" grep.txt)

[root@anuo ~]# egrep "A[0-9][0-9]*" test  或 egrep ‘A[0-9]+‘ test.txt
A1234
A123
A12
A1

3、+號意思是前一個字符有1個或多個

[root@anuo ~]# egrep A[0-9]+ test       
A1234
A123
A12
A1

4、過濾掉以空格開頭的行和去掉空行再去掉以.或以,開頭的行

[root@anuo ~]# cat grep.txt |grep -v ^[[:blank:]]|grep -v ^$ |grep -Ev ^"\.|,"

5、過濾掉以#號開頭的行,空行,以AB開頭的行,以及so結尾的行

[root@anuo ~]# cat /etc/httpd/conf/httpd.conf |grep -v "#"|grep -v ^$ |grep --v ‘^A|B‘|grep -v so$

匹配日期格式YYYY-MM-DD

[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}

匹配IP地址

[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\

總結Linux常用的一些特殊符合

*   表示所有(0到多個)字符。
?   是通配符,代表任意一個字符。
;   一般用於連續不同命令時的分隔符。
#   註釋符。
|   管道
~   表示用戶的家目錄
/   路徑分隔符
>   重定向,會覆蓋老的內容
>>  追加重定向,在老的內容後面追加
<   輸入重定向
<<  追加輸入重定向
‘‘  單引號,不具有變量置換功能,輸出時所見即所得
""  雙引號,具有變量置換功能,解析變量後輸出,
``  反引號,tab鍵上面的的鍵,反引號中間為命令,會先執行,等價$()
{}  中間為命令區塊組合或內容序列
!   邏輯非
&&  邏輯與,前一個指令執行成功時,執行後一個指令,也就是兩個指令都會執行
||  邏輯或,前一個指令執行失敗時,執行後一個指令,兩個指令只會執行一個

Linux的正則表達式