shell 正則表達式

通配符            意義

  *         匹配任意多個字符(包括零個或一個)
  ?         匹配任意一個字符(不包括零個)
  [characters]     匹配任意一個屬於字符集中的字符
  [!characters]    匹配任意一個不是字符集中的字符
  [[:class:]]      匹配任意一個屬於指定字符類中的字符
git

  

     字符類         意義正則表達式

  [:alnum:]      匹配任意一個字母或數字
  [:alpha:]       匹配任意一個字母
  [:digit:]        匹配任意一個數字
  [:lower:]       匹配任意一個小寫字母
  [:upper]       匹配任意一個大寫字母
ide



基礎正則表達式符號

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

a..bspa

能夠表示acdb字符串

      aaab 、abbbbit

但不能夠表示acb、ab、aba等table

*

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

*後面的字符必定要在*前面字符的後面class

另外*先後字符必須相鄰不然匹配不到test

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

擴展正則

 擴展正則包含基礎正則,並且多出了  +    ?   |    ()四個指令(注意這裏的 | 要和管道符分開)   擴展正則不須要像基礎正則同樣對某些符號進行轉義(通常是用 反斜槓  \  來進行)

 


做用:重複一個或者一個以上的前一個字符

示例:執行「egrep -n 'wo+d' test.txt」命令,便可查詢"wood" "woood" "woooooood"等字符串

   

做用:零個或者一個的前一個字符

示例:執行「egrep -n 'bes?t' test.txt」命令,便可查詢「bet」「best」這兩個字符串

   


做用:使用或者(or)的方式找出多個字符

示例:執行「egrep -n 'of|is|on' test.txt」命令便可查詢"of"或者"if"或者"on"字符串

   

()  

做用:查找「組」字符串

示例:「egrep -n 't(a|e)st' test.txt」。「tast」與「test」由於這兩個單詞的「t」與「st」是重複的,因此將「a」與「e」列於「()」符號當中,並以「|」分隔,便可查詢"tast"或者"test"字符串

   

()+  

做用:辨別多個重複的組

示例:「egrep -n 'A(xyz)+C' test.txt」。該命令是查詢開頭的"A"結尾是"C",中間有一個以上的 "xyz"字符串的意思

相關文章
相關標籤/搜索