1、正則表達式與通配符
正則表達式:用來在文件中匹配符合條件的字符串,正則是包含匹配。grep、awk、sed等命令都可以支持正則表達式。
通配符:用來匹配符合條件的文件名,通配符是完全匹配。ls、find、cp這些命令不支持正則表達式,所以只能使用shell自己的通配符來進行匹配了。
2、基礎正則表達式
元字符 | 作用 |
---|---|
* | 前一個字符匹配0次或任意多次; |
. | 匹配除了換行符外任意一個字符; |
^ | 匹配行首。例如:^hello會匹配以hello開頭的行; |
$ | 匹配行尾。例如:hello&會匹配以hello結尾的行; |
[] | 匹配中括號中指定的任意一個字符,只匹配一個字符。 例如:[abcd] 匹配abcd中任意一個字母,[0-9] 匹配任意一位數字, [a-z][0-9] 匹配小寫和一位數字構成的兩位字符; |
[^] | 匹配除中括號的字符以外的任意一個字符。例如:[^0-9] 匹配任意一位非數字字符,[^a-z] 表示任意一位非小寫字母; |
\ | 轉義符。用于將特殊符號的含義取消。 |
\{n\} | 表示其前面的字符恰好出現n次。例如:[0-9]{4} 匹配4位數字; |
\{n,\} | 表示其前面的字符出現不小于n次。例如: [0-9]{2,} 表示兩位及以上的數字; |
\{n,m\} | 表示其前面的字符至少出現n次,最多出現m次。例如: [a-z]{6,8} 匹配6到8位的小寫字母; |
3、測試正則表達式
創建文件test_rule.txt,并且編輯內容。如下圖所示:
3.1、* 前一個字符匹配0次,或任意多次
命令1:grep "h*" test_rule.txt
作用:匹配所有內容,包括空白行;
命令2:grep "hh*" test_rule.txt
作用:匹配至少包含有一個h的行;
命令3:grep "hhh*" test_rule.txt
作用:匹配至少包含兩個連續h的字符串;
3.2、. 匹配除了換行符外任意一個字符
命令:grep "y..r" test_rule.txt
作用:匹配在y和r這兩個字母之間一定有兩個字符的字符串;
3.3、^匹配行首
命令:grep "^m" test_rule.txt
作用:搜索以m開頭的行
3.4、$匹配行尾
命令:grep "h$" test_rule.txt
作用:搜索以h結尾的行
前面在 從零開始學習Linux(三十一):Shell腳本的執行方式 章節中提到過windows下shell腳本和Linux系統下shell腳本格式不同的問題。Linux系統下shell腳本格式是以$為行尾的,但是Windows下面shell腳本格式是以^M$為行尾的。
通過命令"cat -A test_rule.txt"可以查看,如下圖所示:
如果是以^M$為行尾的,使用命令"grep "h$" test_rule.txt",是匹配不到任何數據的。
因此,當使用$匹配行尾且沒有匹配到任何數據的時候,先考慮一下是否是由于文件格式的原因導致的。如果格式不一樣,可以使用前面章節提到的命令轉換一下文件格式。
3.5、[]匹配括號中指定的任意一個字符,只匹配一個字符
命令:grep "h[eh]h" test_rule.txt
作用: 匹配h和h字母中為e和h的行數據。
3.6、 [^] 匹配除中括號的字符以外的任意一個字符
命令:grep "^[^a-z]" test_rule.txt
作用:匹配不以小寫字母開頭的行
3.7、\ 轉義符
命令:grep "\!$" test_rule.txt
作用:搜索以!結尾的行
3.8、\{n\} 表示其前面的字符恰好出現n次
命令:grep "o\{2\}" test_rule.txt
作用:匹配連續出現2次o的行數據
3.9、\{n,m\} 匹配其前面的字符至少出現n次最多出現m次
命令:grep "o\{3,5\}" test_rule.txt
作用:匹配連續出現最少3次,最多5次的行數據