一、grep
grep常用于文本搜索。通過自定義的模式(pattern),篩選出使用者需要的文本內容。除了有grep,還有egrep和fgrep。其中egrep = grep –E,而fgrep則是不支持正則表達式。
grep語法:grep [option] pattern [file]
常用option如下:
-i:忽略字符的大小
-n:顯示匹配的行號
-c:統計匹配的行數
-o:只顯示匹配到的內容
-q:靜默模式,不顯示出任何信息
-e:實現多個選項的or的關系
-w:匹配整個單詞
-v:顯示除pattern外的內容
-F:相當于fgrep
-E:相當于egrep
二、正則表達式
1、匹配字符:
. 匹配任意單個字符
[] 匹配中括號內指定范圍的任意單個字符
[^] 匹配中括號指定范圍外的任意單個字符
[:alnum:] 匹配字母和數字
[:alpha:] 匹配任何英文
[:lower:] 小寫英文字母
[:upper:] 大寫英文字母
[:blank:] 空白字符(空格和字表符)
[:space:] 水平和垂直的空白字符(范圍比blank的廣)
[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴等)
[:digit:] 十進制數字
[:xdigit:] 十六進制數字
[:graph:] 可打印的非空白字符
[:print:] 可打印的字符
[:punct:] 標點符號
2、匹配次數:
* 匹配前面的字符任意次,包括0次。
\? 匹配前面的字符0或1次
\+ 匹配前面的字符至少一次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符從m到n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
3、定位
^ 定位行首,處于pattern的最左側
$ 定位行尾,用于pattern的最右側
\<或\b 詞首,用于pattern中單詞的左側
\>或\b 詞尾,用于pattern中單詞的右側
\<pattern\> 匹配整個單詞
4、分組
\( \)將一個或多個字符捆綁在一起,當作一個整體進行處理。
三、小結
通過一和二的簡單介紹,現在將兩者結合在一起,并把學習后得到的一些理解寫下來。
1、pattern可以直接為想要得到的內容,如圖1。
圖1
2、[ ]中括號里表示的是匹配的內容的范圍,用此括號匹配的結果是一個字符。比如[a-d]表示的是英文abcd這個范圍。[ ]不只表示一種范圍、內容,可以有多種,比如[a-z[:punct:]0-9]表示的是標點符號、英文字母a至z還有數字0-9。但是沒有[0-10]或者是[0-100]等類似的范圍,因為在pattern中把需要被過濾的內容都當作字符,而內容中的數字也被拆成一個個字符,沒有大小可言,簡單點說就是100其實是三個字符1、0、0。還有,單獨用類似上文“二”中的[:digit:]這樣的內容是會出錯的,需要在[:digit:]外再加一個中括號才能表示匹配得到的是一個在digit范圍內的字符,如圖2。
圖2
3、再次強調一點,[ ]表示的是匹配得到一個字符,是一個。因此,需要得到多個字符,得用上文
“二”的第二點知識,如圖3。
圖3
4、\< \>中間括起來的可以為英文和數字,但是不能是別的標點符號,如圖4。
圖4
“\<\>”和“\>”是把一串連續的英文數字當作整體,而“\<”不是,如圖5最后兩個命令都匹配不到內容,是因為“\<\>”和“\>”認為存在abcd但不存在abc。
圖5
5、\(和\)必須成對出現,并且他們被當作一個整體進行處理,并且分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量,命名方式:\1,\2,\3…
示例:\(string1\+\(string2\)*\)
\1:string1\+\(string2\)*
\2:string2
6、 grep –E 作用:除了\<和\>,其他的例如{ }、( ),沒有添加-E時,\{\}表示范圍,添加了-E選項后,直接{}表示范圍。
原創文章,作者:Eminem,如若轉載,請注明出處:http://www.www58058.com/83170