shell腳本——正則表達式


什么是正則表達式  

  正則表達式分為基礎正則和擴展正則,都是為了匹配符合預期要求的字符串

正則表達式與通配符的區別

  只需要記住,對文件內容或是展示文本的操作都是正則,而對目錄或文件名的操作則都是通配符(例如find指令)  

基礎正則和擴展正則

  擴展正則包含基礎正則,而且多出了  +    ?   |    ()四個指令(注意這里的 | 要和管道符分開)

  擴展正則不需要像基礎正則一樣對某些符號進行轉義(一般是用 反斜杠  \  來進行) 

基礎正則表達式符號

符號 描述 實例
. 代表單個字符(必須存在)

a..b

可以表示acdb

      aaab 、abbbb

但不可以表示acb、ab、aba等

*

要和通配符區分開,匹配 * 前面一個字符的0個或多個

*后面的字符一定要在*前面字符的后面

另外*前后字符必須相鄰否則匹配不到

a*b

可以表示ab、aab、b、abababab

但不可以表示acb、ba等

acb只會匹配到b,也就是視為b前面有0個a

ba也只會匹配到b,同樣視為b前面有0個a

^ 匹配 ^ 后面字符串開頭

 輸入:echo  -e  abcd\accc | grep "^ab"

輸出:abcd

$  匹配 $ 前面字符串結尾  

 輸入:echo  -e  abcd\accc | grep "cc$"

輸出:accc

 .*  匹配任意個字符(0到多個)

 a.*b

和通配符里面的 * 大致類似

可以代表ab、 acb、 a……b

但不能代表b……a

 []

 表示范圍,可以用來進行模糊匹配

常用選項為【a-z】 【0-9】

1.  grep【0-9】 text 過濾出含數字的行

2.  grep【a-z】 text 過濾出含小寫字母的行

3.  grep 【abc】 text 過濾出含有a,b,c的行(注意這個abc是分別匹配,也就是相當於匹配含有a的行,b的行,c的行,並不是字符串abc的行

 {}

{n,m}表示匹配 {} 前面字符的至少n個,最多m個 字符,注意:是連在一起的連續字符

還可以為{n,}表示至少有n個

{,m}表示最多有m個

 1.輸入echo abbcdfbjk | grep -E "b{1,2}"

輸出 abbcdfbjk 

2. 如果 輸入 echo abbcdfbjk | grep -E "b{2,}"  #表示至少兩個

輸出結果為 abbcdfbjk  可以看到只有連在一起的兩個bb被匹配到,也就是說明了{}里面的數字表示的不是匹配到的個數,而是匹配字符的長度,像這個例子就是要求出現 b 的長度至少是2,所以只有 bb 被匹配到了

3.  輸入 grep -E "ac{2,5}b" 匹配a和b之間至少2個最多5個c的行,但是acb要連在一起

 【^】  【^a】表示匹配 a 以外的所有字符

 輸入  echo  -e abc \ def \ lmn | grep "[^f-z]"

輸出  abc  def lmn,只有[a-e]配匹配到

 ^[^]  匹配 ^[^a]中的以a為開頭以外的所有行  grep "^[^#]"  /etc/passwd   匹配  /etc/passwd  里面不以#開頭的所有行
\<  ;  \>

錨定 單詞首部 (尾部)  

表示在匹配在首部(尾部)以空格或特殊字符為分隔的指定字符。如果同時錨定首尾  \<  \>  則表示這個字符的准確匹配,它的前后為特殊字符或空格分隔,不會和任何字符直接連接

注意:必須要加 \ 轉義,即使使用擴展正則也要加  \  進行轉義

 輸入 :echo "hi,rootamroot" | grep "\<root"
輸出:hi,rootamroot

輸入: echo "hiroot iamroot" | grep "root\>"
輸出: hiroot iamroot

 輸入: echo "hi,root  iamroot" | grep "\<root\>"
輸出:hi,root  iamroot

 ()

 \1  調用前面的參數—第一個分組(也就是括號里的參數)

如果用擴展正則則不需要 \ 來進行轉義

 

過濾出一行中有兩個相同數字的行

# grep "\([0-9]\).*\1"  /etc/passwd

過濾出行首和行位字母相同的行

# grep "^\([a-z]\).*\1$" /etc/passwd

a?表示前一個參數0個或1個

 
+

a+表示前一個參數1個或多個

 
|

(a|b)表示或的關系,a、b

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM