文本處理工具之grep
1、linux文本處理工具:
grep:文本過濾工具,可以基於字符串和PATTERN進行過濾
sed:流編輯器
awk:linux上的實現為gawk,文本報告生成器,格式化文本。
以上三個工具都會用到正則表達式。
2、正則表達式介紹:
由一類特殊字符及文本所編寫的模式,其中有些字符不表示其字面意義,而是用於表示控制或通配的功能。
正則表達式分類:
基本正則表達式(BRE)
擴展正則表達式(ERE)
3、grep:global search regular expression and printout the line;全文搜索每一行,對字符串及模式進行匹配,然後在輸出匹配的行。
grep作用:文本搜索工具,根據用戶指定的“模式(過濾條件)”,對目標文本逐行進行匹配檢查,打印匹配到的行。
模式(過濾條件):是指由正則表達式的元字符及文本字符所編寫出的過濾條件。
另:
grep:支持基本正則表達式,-E,支持擴展正則表達式
egrep:支持擴展正則表達式,-G,支持基本正則表達式
fgrep:不支持正則表達式,可以和-E、-G一起使用;過濾速度最快
4、grep命令:
命令格式:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
[OPTIONS]:
--color=auto:對匹配到的文本做高亮顯示
-i:忽略字符大小寫;
-o:僅顯示匹配到的行
-v:顯示不能被模式匹配到的行
-E:支持使用擴展的正則表達式
-q:靜默模式,不輸出任何消息
-A # :被模式匹配的行後面#行顯示出來;after;
-B # :被模式匹配的行前面#行顯示出來;before;
-C # :被模式匹配的行前後面#行顯示出來;after;
5、基本正則表達式元字符: 分類: 字符匹配 . [] [^] 次數匹配 * \? \+ \{m\} \{m,n\} 位置錨定 \< \> \b ^ $ 分組及引用 \( \) 分類具體介紹: ①字符匹配: . :匹配任意單個字符 [] :匹配指定範圍內的任意單個字符 [^] :匹配制定範圍外的任意單個字符 [[:digit:]] 0-9數字集合 [[:lower:]] 所有小寫字母中的任意一個字符 [[:upper:]] 所有大寫字母中的任意一個字符 [[:alpha:]] 所有大小寫字母中的任意一個字符 [[:alnum:]] 所有字母及數字中的一個字符 [[:punct:]] 所有的標點符號中的任意一個字符 [[:space:]] 空格字符 ②次數匹配:默認工作於貪婪模式,能匹配多長就匹配多長; * :匹配其前面的字符任意次;0次、1次、多次 .* :匹配任意長度的任意字符 \? :匹配其前面的字符0次或1次;前面的字符至多出現一次; \+ :匹配其前面的字符1次或多次;前面的字符至少出現一次; \{m\} :匹配其前面的字符m次 \{m,n\} :匹配其前面的字符至少m次,至多n次; \{0,n\} :匹配其前面的字符至多n次; \{m,\} :匹配其前面的字符至少m次; 如:grep “x\{2,5\}y" test.txt ③位置錨定: ^ :行首錨定;用於模式的最左側,如 ^root $ : 行尾錨定;用於模式的最右側,如 root$ ^PATTERN$ :用PATTERN來匹配整行; ^$ :空白行 ^[[:space:]]*$ :匹配空白字符任意次;空白行,或包括空白字符的行 \<或\b :詞首錨定,用於單詞的左側,建議用\< \>或\b :詞尾錨定,用於單詞的右側,建議用\> 註意:單詞是指由非特殊字符組成的連續字符(字符串) ④分組及引用 \( \):將一個或多個字符捆綁在一起,當作一個整體進行處理;如:\(xy\)*ab表示匹配xy出現任意次後跟ab字符的行; 註意:分組括號中模式匹配到的內容會被正則表達式引擎自動記錄與內部的變量中,這些變量為: \1:模式從左側起,第一個左括號與之匹配的右括號之間的模式匹配到的字符 \2:模式從左側起,第二個左括號與之匹配的右括號之間的模式匹配到的字符 \...:模式從左側起,第...個左括號與之匹配的右括號之間的模式匹配到的字符 如: he likes his lover he loves his lover she likes her liker she loves her liker grep "\(l..e\).*\1 test.txt 後項引用:引用前面的分組括號中的模式所匹配到的字符。 | 6、擴展正則表達式元字符: 分類: 字符匹配 . [] [^] 次數匹配 * ? + {m} {m,n} 位置錨定 \< \> \b ^ $ 分組及引用 ( ) 或 分類具體介紹: ①字符匹配: . :匹配任意單個字符 [] :匹配指定範圍內的任意單個字符 [^] :匹配制定範圍外的任意單個字符 [[:digit:]] 0-9數字集合 [[:lower:]] 所有小寫字母中的任意一個字符 [[:upper:]] 所有大寫字母中的任意一個字符 [[:alpha:]] 所有大小寫字母中的任意一個字符 [[:alnum:]] 所有字母及數字中的一個字符 [[:punct:]] 所有的標點符號中的任意一個字符 [[:space:]] 空格字符 ②次數匹配:默認工作於貪婪模式,能匹配多長就匹配多長;與基本正則表達式的區別是少了轉義字符"\". * :匹配其前面的字符任意次;0次、1次、多次 .* :匹配任意長度的任意字符 ? :匹配其前面的字符0次或1次;前面的字符至多出現一次; + :匹配其前面的字符1次或多次;前面的字符至少出現一次; {m} :匹配其前面的字符m次 {m,n} :匹配其前面的字符至少m次,至多n次; {0,n} :匹配其前面的字符至多n次; {m,} :匹配其前面的字符至少m次; 如:grep “x{2,5}y" test.txt ③位置錨定: ^ :行首錨定;用於模式的最左側,如 ^root $ : 行尾錨定;用於模式的最右側,如 root$ ^PATTERN$ :用PATTERN來匹配整行; ^$ :空白行 ^[[:space:]]*$ :匹配空白字符任意次;空白行,或包括空白字符的行 \<或\b :詞首錨定,用於單詞的左側,建議用\< \>或\b :詞尾錨定,用於單詞的右側,建議用\> 註意:單詞是指由非特殊字符組成的連續字符(字符串) ④分組及引用 與基本正則表達式的區別是少了轉義字符"\". ( ):將一個或多個字符捆綁在一起,當作一個整體進行處理;如:\(xy\)*ab表示匹配xy出現任意次後跟ab字符的行; 註意:分組括號中模式匹配到的內容會被正則表達式引擎自動記錄與內部的變量中,這些變量為: \1:模式從左側起,第一個左括號與之匹配的右括號之間的模式匹配到的字符 \2:模式從左側起,第二個左括號與之匹配的右括號之間的模式匹配到的字符 \...:模式從左側起,第...個左括號與之匹配的右括號之間的模式匹配到的字符 如: he likes his lover he loves his lover she likes her liker she loves her liker grep -E "(l..e).*\1 test.txt 後項引用:引用前面的分組括號中的模式所匹配到的字符。 ⑤或 a|b a|b :表示匹配整個左側的a或整個左側的b 如:c|Cat :表示c或者Cat (C|c)at:表示Cat或者cat |
5、基本正則表達式元字符:
分類:
字符匹配 . [] [^]
次數匹配 * \? \+ \{m\} \{m,n\}
位置錨定 \< \> \b ^ $
分組及引用 \( \)
分類具體介紹:
①字符匹配:
. :匹配任意單個字符
[] :匹配指定範圍內的任意單個字符
[^] :匹配制定範圍外的任意單個字符
[[:digit:]] 0-9數字集合
[[:lower:]] 所有小寫字母中的任意一個字符
[[:upper:]] 所有大寫字母中的任意一個字符
[[:alpha:]] 所有大小寫字母中的任意一個字符
[[:alnum:]] 所有字母及數字中的一個字符
[[:punct:]] 所有的標點符號中的任意一個字符
[[:space:]] 空格字符
②次數匹配:默認工作於貪婪模式,能匹配多長就匹配多長;
* :匹配其前面的字符任意次;0次、1次、多次
.* :匹配任意長度的任意字符
\? :匹配其前面的字符0次或1次;前面的字符至多出現一次;
\+ :匹配其前面的字符1次或多次;前面的字符至少出現一次;
\{m\} :匹配其前面的字符m次
\{m,n\} :匹配其前面的字符至少m次,至多n次;
\{0,n\} :匹配其前面的字符至多n次;
\{m,\} :匹配其前面的字符至少m次;
如:grep “x\{2,5\}y" test.txt
③位置錨定:
^ :行首錨定;用於模式的最左側,如 ^root
$ : 行尾錨定;用於模式的最右側,如 root$
^PATTERN$ :用PATTERN來匹配整行;
^$ :空白行
^[[:space:]]*$ :匹配空白字符任意次;空白行,或包括空白字符的行
\<或\b :詞首錨定,用於單詞的左側,建議用\<
\>或\b :詞尾錨定,用於單詞的右側,建議用\>
註意:單詞是指由非特殊字符組成的連續字符(字符串)
④分組及引用
\( \):將一個或多個字符捆綁在一起,當作一個整體進行處理;如:\(xy\)*ab表示匹配xy出現任意次後跟ab字符的行;
註意:分組括號中模式匹配到的內容會被正則表達式引擎自動記錄與內部的變量中,這些變量為:
\1:模式從左側起,第一個左括號與之匹配的右括號之間的模式匹配到的字符
\2:模式從左側起,第二個左括號與之匹配的右括號之間的模式匹配到的字符
\...:模式從左側起,第...個左括號與之匹配的右括號之間的模式匹配到的字符
如:
he likes his lover
he loves his lover
she likes her liker
she loves her liker
grep "\(l..e\).*\1 test.txt
後項引用:引用前面的分組括號中的模式所匹配到的字符。
6、擴展正則表達式元字符:
分類:
字符匹配 . [] [^]
次數匹配 * ? + {m} {m,n}
位置錨定 \< \> \b ^ $
分組及引用 ( )
或
分類具體介紹:
①字符匹配:
. :匹配任意單個字符
[] :匹配指定範圍內的任意單個字符
[^] :匹配制定範圍外的任意單個字符
[[:digit:]] 0-9數字集合
[[:lower:]] 所有小寫字母中的任意一個字符
[[:upper:]] 所有大寫字母中的任意一個字符
[[:alpha:]] 所有大小寫字母中的任意一個字符
[[:alnum:]] 所有字母及數字中的一個字符
[[:punct:]] 所有的標點符號中的任意一個字符
[[:space:]] 空格字符
②次數匹配:默認工作於貪婪模式,能匹配多長就匹配多長;與基本正則表達式的區別是少了轉義字符"\".
* :匹配其前面的字符任意次;0次、1次、多次
.* :匹配任意長度的任意字符
? :匹配其前面的字符0次或1次;前面的字符至多出現一次;
+ :匹配其前面的字符1次或多次;前面的字符至少出現一次;
{m} :匹配其前面的字符m次
{m,n} :匹配其前面的字符至少m次,至多n次;
{0,n} :匹配其前面的字符至多n次;
{m,} :匹配其前面的字符至少m次;
如:grep “x{2,5}y" test.txt
③位置錨定:
^ :行首錨定;用於模式的最左側,如 ^root
$ : 行尾錨定;用於模式的最右側,如 root$
^PATTERN$ :用PATTERN來匹配整行;
^$ :空白行
^[[:space:]]*$ :匹配空白字符任意次;空白行,或包括空白字符的行
\<或\b :詞首錨定,用於單詞的左側,建議用\<
\>或\b :詞尾錨定,用於單詞的右側,建議用\>
註意:單詞是指由非特殊字符組成的連續字符(字符串)
④分組及引用 與基本正則表達式的區別是少了轉義字符"\".
( ):將一個或多個字符捆綁在一起,當作一個整體進行處理;如:\(xy\)*ab表示匹配xy出現任意次後跟ab字符的行;
註意:分組括號中模式匹配到的內容會被正則表達式引擎自動記錄與內部的變量中,這些變量為:
\1:模式從左側起,第一個左括號與之匹配的右括號之間的模式匹配到的字符
\2:模式從左側起,第二個左括號與之匹配的右括號之間的模式匹配到的字符
\...:模式從左側起,第...個左括號與之匹配的右括號之間的模式匹配到的字符
如:
he likes his lover
he loves his lover
she likes her liker
she loves her liker
grep -E "(l..e).*\1 test.txt
後項引用:引用前面的分組括號中的模式所匹配到的字符。
⑤或 a|b
a|b :表示匹配整個左側的a或整個左側的b
如:c|Cat :表示c或者Cat
(C|c)at:表示Cat或者cat
文本處理工具之grep