文本检索秘技之正则表达式grep和egrep
一、總綱(何為正則)
? ?所謂正則,又稱正則表達式、正規表示法、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些符合某個模式的文本。(維基百科如是說)
? ?為了便于理解,可以將正則想象成為普通語言,普通字符對應的是普通文字,而元字符則對應語法,根據語言的規則,按照語法將文字組合起來,就會表述出你想說的話即想要的文本。
第一式 ?grep是什么
? ?grep(global search regular expression(RE)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行打印出來。UNIX的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的擴展,支持更多的re元字符,fgrep就是fixed grep或fast grep,它們把所有的字母都看做單詞,也就是說,正則表達式中的元字符表示回其自身的字面意義,不再特殊。linux使用GNU版本的grep。它功能更強,可以通過-G、-E、-F命令行選項來使用egrep和fgrep的功能。
格式:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
第一招:常用選項[OPTIONS]
-v: 反向,顯示不能被模式所匹配到的行;
| 1 2 | #檢索文件/etc/passwd中非#的行 grep?-v?"#"?/etc/passwd |
-o: 僅顯示被模式匹配到的字串,而非整行;
| 1 2 | #檢索/etc/passwd文件中有沒有rpcuser用戶 grep?-o?"rpcuser"?/etc/passwd |
-i:?不區分字符大小寫, ignore-case
| 1 2 | #檢索/etc/fstab中包含u中間跟兩個任意字符,最后一個字符為d的行,不區分大小寫 grep?--color -i?"u..d"?/etc/fstab |
-E: 支持擴展的正則表達式(加-E可以使用grep啟用egrep的功能 grep -E)
-A #:之后的幾行字符
-B:之前的幾行字符
-C #:上下兩行
-n: 顯示匹配行及行號,在顯示出內容的每行前面會顯示行數
第二招:模式(PATTERN)
元字符:不表示字符本身的意義,用于額外功能性的描述
字符匹配:
.: 任意單個字符
| 1 2 | #在/etc/passwd文件中檢索包含r后面跟兩個字符,然后是t的行 grep?--color?"r..t"?/etc/passwd |
[ ]: 指定范圍內的任意單個字符
| 1 2 | #在/etc/inittab下檢索以S或s后面接任意一個字符,之后是s的行 grep?--color?"[sS].s"?/etc/fstab |
[[:digit:]] 匹配任何一個數字([0-9]
| 1 | grep?--color?"jin[[:digit:]]"?/etc/passwd |
[[:alnum:]] 匹配任何一個字母或數字([A-Za-z0-9])
[[:alpha:]] 匹配任何一個字母([A-Za-z])
[[:lower:]] 匹配任何一個小寫字母([a-z])
[[:upper:]] 匹配任何一個大寫字母([A-Z])
[[:space:]] 任何一個空白字符:制表符、空格
[[:punct:]] 任何一個標點符號(不包括:[:alnum:]、[:cntrl:]、[:space:]字符集)
[^]:指定范圍外的任意單個字符
| 1 2 | #在/etc/selinux/config下檢索非標點符號開始的行 grep?--color?"^[^[:punct:]].*"?/etc/selinux/config |
位置錨定:用于指定字符出現的位置
^: 錨定行首
$: 錨定行尾
| 1 2 | 以bash結尾的行 grep?--color?"bash$"?/etc/passwd |
^$: 空白行
| 1 2 | #統計/etc/init/tty.conf文件中的空行數 grep?"^$"?/etc/init/tty.conf? |wc?-l |
\<char: 錨定詞首,也可以寫成\bchar(注:\b是元字符)
| 1 2 | #檢索/etc/passwd 文件中以r為詞首,后面跟兩個任意字符,最后一個字符是t的行 grep?--color?"\br..t"?/etc/passwd |
char\>: 錨定詞尾,char\b(注:\b也可以用于錨定詞尾)
| 1 2 | #以s結尾前面以三個任意字符開頭的系統用戶 grep?--color?"^...s\b"?/etc/passwd |
次數匹配:用來指定匹配其前面的字符的次數
*: 任意次(0次或多次)
| 1 2 | #a*b重復a為零次或多次(貪婪模式:盡可能的長的去匹配字符;) grep?--color ab*bd?test.txt |
.*: 匹配任意長度的任意字符
| 1 2 | #\?: 0次或1次(a\?b 則表示a的匹配一次或一次都沒有) grep?--color?"a\?b"?test.txt |
ab*xy:則表示只能匹配*號之前b任意次b(0或多次)
\{m\}: 匹配m次
\{m,n\}:最少匹配m次,最多匹配n次
\{m,\}: 至少m次;
\{0,n\}:至多n次;
分組:
\(\)
| 1 2 | #檢索文件中包含w字符之以es為組后面接t然后任意字符,組es重復一次的行 grep?--color?"w\(es\).*\1"?test.txt |
(es)被作為一個組看待,它是一個組,它的名稱是1,然后?.*表示之后的任意個字符,[\1]指代的是前面用括號括起來的es。那么??egrep?里的?w(es)t.*\1?就是說?west后面任意字符,再然后再出現es的,這種行被匹配到
引用:
\1: 后向引用,引用前面的第一個左括號以及與之對應的右括號中的模式所匹配到的內容。(后向引用可以有多次,方法\#(#:數字))
第二式:egrep(grep -E)
為?grep?的擴充版本,?改良了許多傳統?grep?不能或不便的操作.?比方說:
- grep?之下不支持???與?+?這兩種?modifier,?但?egrep?則可. ? ? ?
注:
?: 匹配其前面的字符0或1次;
+: 匹配其前面的字符至少1次
|:表示或關系,比如 'gd|good|dog' 表示有gd,good或dog的串
():將部分內容合成一個單元組。比如要搜索 glad 或 good 可以這樣 'g(la|oo)d',()的好處是可以對小組使用 + ? * 等。
比如要搜索A和C開頭結尾,中間有至少一個(xyz) 的串,可以這樣 : 'A(xyz)+C'
- grep?不支持?a|b?或?(abc|xyz)?這類"或一"比對,?但?egrep?則可. ?
| 1 2 3 4 | #輸出包含1或2的行 grep?--color?'\(1\|2\)'?/etc/inittab #或 grep?--color -E?'(1|2)'?/etc/inittab |
- grep?在處理?{n,m}?時,?需用?\{?與?\}?處理,?但?egrep?則不需.
諸如此類的...?我個人會建議能用?egrep?就不用?grep?啦.. ? ? ? ?
第三式:fgrep
不作?RE?處理,?表達式僅作一般字符串處理,?所有?meta?均失去功能.
?===================================完=========================================
PS:以上是本人學習整理內容,由于能力有限,如有錯漏,歡迎各種磚頭瓦塊.a_c
本文轉自 jinlinger 51CTO博客,原文鏈接:http://blog.51cto.com/essun/1361920,如需轉載請自行聯系原作者 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的文本检索秘技之正则表达式grep和egrep的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu安装webmin
- 下一篇: JavaScript———从setTim