本節索引
一、文本三劍客之grep介紹
二、正則表達式的相關概念
三、基本正則表達式(BER)
四、拓展正則表達式(ERE)
五、正則表達式中的元字符與通配符的使用區別
一、文本三劍客之grep介紹:
grep (縮寫來自Globally search a Regular Expression and Print)是一種強大的文本搜索工具,它能使用特定模式匹配(包括正則表達式)搜索文本,并默認輸出匹配行。
Linux文本處理三劍客:
grep:文本過濾工具
awk:Linux上的實現gawk,文本報告生成器(傳送門)
grep,基于行過濾的文本過濾工具
格式:
grep [OPTION]… PATTERN [FILE]…
option:
-v???? 顯示不被匹配到的行
-i????? 忽略字符大小寫
-n???? 添加匹配到的行的行號
-c???? 統計被匹配到的行數
-o???? 僅顯示匹配到的字符
-q???? 靜默模式
-A#?? 包含此匹配行和后#行
-B#?? 包含此匹配行和前#行
-C#?? 包含此匹配行和前后#行
-e???? 實現多個匹配字符的或者(or)關系 -e a -e b:a或b
-w??? 匹配整個單詞,數字、字母、下劃線都算單詞一部分
-r????? 遞歸目錄
-E???? 使用ERE,擴展的正則表達式
-F???? 相當于fgrep
grep工具之所以功能強大,是因為它支持正則表達式進行匹配,那什么又是正則表達式呢?
二.正則表達式的相關概念
1.正則表達式語言由兩種基本字符類型組成:原義(正常)文本字符和元字符。元字符使正則表達
式具有處理能力。所謂元字符就是指那些在正則表達式中具有特殊意義的專用字符,可以用來規
定其前導字符(即位于元字符前面的字符)在目標對象中的出現模式
正則表達式(REGEXP):由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不
表示字符表面意義,而表示控制或通配功能
2.正則表達式與通配符的區別:通配符匹配的是文件名中的字符,不能匹配文件的文本內容的字符
串(詳見前篇:帶你認識Linux中的通配符),這時候就需要用到正則表達式。
3.正則表達式分兩類:
基本正則表達式:BRE;只承認的元字符有^$.[]*其他字符識別為普通字符:\(\)需要轉義
擴展正則表達式:ERE;則添加了(){}?+|等
grep -E,egrep
4.正則表達式引擎:
采用不同算法,檢查處理正則表達式的軟件模塊
基于PCRE語言(逐漸沒落)兼容的正則表達式
5.元字符分類:字符匹配、匹配次數、位置錨定、分組(幫助文檔:man 7 regex)
三、基本正則表達式(BRE)的元字符介紹:
1.字符匹配:
.??????? 匹配任意單個字符,放在[]中就表示點
[]????? 匹配括號內任意單個字符
[^]??? 匹配指定范圍外的任意單個字符
[:alnum:] 任意一個字母和數字
[:alpha:]? 任意一個字母
[:lower:]? 任意一個小寫字母
[:upper:]? 任意一個大寫字母
[:digit:]??? 任意一個數字
[:space:]? 水平或垂直空白字符
[:punct:]? 標點符號
注意:正則表達式使用字符集作為搜索條件時,一定要加雙引號,如”[[:digit:]]”;否則正則表達式會將字符集作為一個個字符進行識別
轉義符“\”使正則表達式中具有特殊含義的字符顯示其本身,如\.只表示小數點
2.匹配次數(某個字符出現的次數)
*?????? 匹配前面的字符任意次,包括0次(貪婪模式,盡可能長的匹配)
.*???? 任意長度的任意字符
\??? 匹配前面的字符0或1次,可看做 \{0,1\}
\+???? 匹配前面的字符至少1次,可看做\{1,\}(可實現懶惰模式)
\{m\}??????? 精確匹配前面的字符m次
\{m,\}?? 至少匹配前面的字符m次
\{,m\}????? 至多匹配前面的字符m次
\{m,n\}匹配前面的字符m到n次
3.位置錨定
^?????? 行首錨定,用于模式最左側
$?????? 行尾錨定,用于模式最右側
^$??? 表示空行
\<或\b???? 單詞的詞首錨定
\>或\b???? 單詞的次尾錨定
\<word\> 匹配整個單詞,同grep -w
4.分組
\(\)將一個或多個字符捆綁在一起,當做一個整體進行處理,如:\(root\)\+
分組括號中匹配到的內容會被正則表達式記錄與內部變量中,這些變量命名方式
為:\1,\2,\3,…
\1表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
后向引用:\1表示的是前面匹配的結果而不是前面匹配的模式
例:echo rootxxrbbt|grep ‘\(r..t\).*\1’
\1代表root,而不是r..t
5.或者:\|
例:a\|b:a或b; C\|cat:C或cat \(C\|c\)at:Cat或cat
四、擴展正則表達式(ERE)元字符介紹:
egrep ? ? ?同grep -E
擴展正則表達式(ERE)可理解為將基礎正則表達式中的轉義符全部去掉,其字符匹配與基礎正則表達式(BRE)相同。
1.次數匹配:
*?????? 匹配前面字符任意次
???? 0或1次,可看做{0,1}
+?????? 1次或多次.可看做{1,}
{m}? 匹配m次
{m,n}??????? 匹配m到n次
2.位置錨定:
^?????? 行首
$?????? 行尾
\<,\b??????? 語首
\>,\b ????? 語尾
3.分組:
()
后向引用:\1,\2,…
4.或者:
a|b? a或b
C|cat?????? C或cat
(C|c)at?????? Cat或cat
五、正則表達式中的元字符與通配符的區別
作用不同:通配符匹配的是文件名中的字符,而正則表達式匹配的是文件的文本內容的字符串;
兩者之間有很多相同之處,也有不同點,其中:
1.正則表達式元字符與通配符代表意義不同的有:
通配符中:
* 表示任意長度的任意字符
? 表示任意一個單個字符
正則表達式:
*表示匹配前面的字符任意次
. 表示匹配任意一個單個字符
.*表示任意長度的任意字符
2.正則表達式元字符與通配符含義相似的有:
[]????? 匹配括號內任意單個字符
[^]??? 匹配指定范圍外的任意單個字符
[:alnum:] 任意一個字母和數字
[:alpha:]? 任意一個字母
[:lower:]? 任意一個小寫字母
[:upper:]? 任意一個大寫字母
[:digit:]??? 任意一個數字
[:space:]? 水平或垂直空白字符
[:punct:]? 標點符號
…等字符集
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/95103
grep ‘^$’ f1 | wc -l
grep -c ‘^$’ f1
上面兩個是等價寫法