一、正則表達式
1.1 什么是正則表達式
正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。在Linux中也就是代表我們定義的模式模板,Linux工具可以用它來過濾文本。
Linux的工具(如sed編輯器或者gawk程序)能夠在處理數據時使用正則表達式對數據進行模式匹配,如果數據符合匹配的要求,那么就會進入下一步處理;如果數據不符合匹配的要求,就會被過濾掉。
正則表達式模式利用通配符來描述數據流中的一個或多個字符,在我們學習Linux之前的很多場景中都可以使用通配符來秒速不確定的數據。
我們經常使用ls
命令加通配符來完成對數據的簡單查找,使用 “ * ” 通配符找出來 .txt結尾的文件,如下圖所示:
但是 *.sh 結尾列出了所有txt文本文件,不管前面是數字還是字母,也不管有多少個,反正只要是txt結尾的文件就行了,正則表達式的工作原理和這個類似,但是正則表達式是功能更強大,不僅可以匹配數字和字母的區別,也可以對數字和字母的個數進行過濾。
1.2 基礎正則常見元字符
1.2.1 正則表達式的組成
正則表達式是由普通字符與元字符組成:
普通字符包括大小寫字母、數字、標點符號及一些其他符號。
元字符是指在正則表達式中具有特殊意義的專用字符,可以用來規定其前導字符( 即位於元字符前面的字符)在目標對象中的出現模式。
1.2.2 常見的元字符(支持的工具:grep、egrep、sed和awk)
\ :轉義字符,用於取消特殊符號的含義,例: \!、 \n、\$等
^ :匹配字符串開始的位置,例: ^a、^the、 ^#、^[a-z]
$ :匹配字符串結束的位置,例: word$、 ^$匹配空行
:匹配除\n之外的任意的一p個字符,例: go.d、 g…d
* :匹配前面子表達式0次或者多次,例: goo*d、 go. *d
[ list ] :匹配list列表中的一個字符,例: go[ola]d, [abc]、 [a-z]、 [a-z0-9]、 [0-9]匹配任意一位數字
[^list] :匹配任意非list列表中的一個字符,例: [^0-9]、 [^A- Z]、 [0-9]、 [^a-z]匹配任意一位非小寫字母
\{n\} :匹配前面的子表達式n次,例: go\{2\}d、 '[0-9]\{2\} '匹配兩位數字
\{n,\} :匹配前面的子表達式不少於n次,例: go\{2,\ }d、 '[0-9]\{2, \} '匹配兩位及兩位以上數字
{n,m} :匹配前面的子表達式n到m次,例: go{2,3}d、 '[0-9]{2,3} '匹配兩位到三位數字
注: egrep、 awk使用{n}、{n,}、{n,m} 匹配時“{}"前不用加“\”
1.2.3 擴展正則表達式元字符(支持的工具:egrep、awk)
POSIX ERE模式包括了一些可供Linux應用和工具使用的額外符號,gawk程序能夠識別ERE模式,但是sed編輯器不能。
sed編輯器和gawk程序的正則表達式引擎之間是由區別的,gawk程序可以使用大多數擴展正則表達式模式符號,並且能提供一些額外的過濾功能,而這些功能都是sed編輯器所不具備的。但正因為如此,gawk程序處理數據流時才比較慢。
1 問號 ?
問號類似於星號,不過有點細微的不同,問號表示前面的字符可以出現0次或1次,僅限於此,不會匹配多次出現的字符。
將問號結合字符組一起使用
如果字符組中的字符出現了0次或1次,匹配就會成立,但是如果兩個字符都出現了,或者其中一個字符出現了2次,那么匹配都無法成立。案例如下:
加號 +
加號是類似於星號的另一個模式符號,但跟問號也有所不同,加號表示前面的字符可以出現1次或者多次,但是必須出現1次,如果該字符沒有出現,則無法匹配。
將加號結合字符組一起使用
如果字符組中定義的任一字符出現了,文本就會匹配,全部出現也可以匹配到。
管道符號 |
管道符號允許在檢查數據流時,用邏輯OR(或)方式指定正則表達式要是用的模式,如果任意一個模式匹配了數據流文本,文本就通過,如果沒有匹配到,那么數據則匹配失敗。
使用管道符號的格式:expr1 | expr2 | expr1....
管道符號兩側的正則表達式可以采用任何正則表達式模式(包括字符組)來定義文本。
圓括號()
將括號中的字符串作為一個整體。正則表達式模式也可以使用圓括號進行分組,當我們將正則表達式模式分組時,該組會被視為一個標准字符,然后就可以像對普通字符一樣給改組使用特殊字符了。
將字符組和管道符號一起使用
(a|b)b(c|d)會匹配第一組中字符的任意組合以及第二組中字符的任意組合。
花括號 { }
花括號允許為可重復的正則表達式指定一個上限,這通常稱為間隔(interval),可以用兩種格式來指定區間。
m:正則表達式准確出現的次數m;
m,n:正則表達式至少出現m次,最多n次。
這個特性可以精確的調整字符或者字符集在模式中出現的具體次數。
默認情況下,gawk程序不會識別正則表達式間隔,必須指定gawk程序的- -interval命令行選項才能識別正則表達式的間隔。
將間隔模式結合分組和字符組一起使用