shell-正則表示式
正則表示式元字元
正則表示式功能和萬用字元功能差不多,但是比萬用字元功能更加強大。
^:匹配行首。表示以某個字元開頭。
[^0-9]:^出現在[]中,表示否定的意思。這裡表示非數字。
$:匹配行尾。表示以某個字元結尾。
^$:表示空行的意思。
.:匹配任意單個字元。表示任意一個字元。注意,不是2個,也不是0個,只能是1個字元。
*:表示前面的字元,出現0次或者多次。
.*:表示任意多個字元。
+:表示前面的字元,出現1次或者多次。
?:表示前面的字元,出現0次或者1次。
[]:表示中括號中的任意一個字元。注意,只能是1個字元。
\<:表示單詞的開頭。
\>:表示單詞的結尾。
\b單詞\b:用來匹配單詞。
\(\):分組,反向引用。
\{n\}:表示前面的字元出現n次。
\{n,\}:表示前面的字元最少出現n次,最多不限。
\{n,m\}:表示前面的字元最少出現n次,最多出現m次。
結合grep命令詳細說明元字元含義
^:匹配行首。表示以某個字元開頭。
[^0-9]:^出現在[]中,表示否定的意思。這裡表示非數字。
樣例檔案: [root@localhost reTest]# cat passwd root:x:0:0:root:/root:/bin/bash#!)@( bin:x:1:1:bin:/bin:/sbin/nologink8989*&^ daemon:x:2:2:daemon:/sbin:/sbin/nologinoiou adm:x:3:4:adm:/var/adm:/sbin/nologindfdfd 2323adm:x:3:4:adm:/var/adm:/sbin/nologin3232 root:x:0:0:root:/root:/bin/bash [root@localhost reTest]#
$:匹配行尾。表示以某個字元結尾。
^$:表示空行的意思。
注意,使用正則的時候,要加上單引號或者雙引號,防止bash將裡面的元字元當成萬用字元了。
這裡面的r沒有加引號,是因為,正則表示式中有表示行頭,shell的萬用字元中也有^,也表示行頭,都能夠識別到,因此,不加引號沒問題。但是推薦使用正則時加上引號。
.:匹配任意單個字元。類似萬用字元中的?
表示任意一個字元。注意,不是2個,也不是0個,只能是1個字元。
第一個表示過濾出r後面跟4個字元的內容,無論這4個字元是什麼。
第二個表示過濾出行首是r後面跟4個字元的內容。
*:表示前面的字元,出現0次或者多次。
注意,和萬用字元中的所表示的意義不同。
這裡
例子中,ot*,表示這個t可以出現也可以不出現,如果出現的話,可以出現多次,因此,類似o,ot,ottt這樣的都可以匹配到。
上面oot也匹配到,因為,第一個o表示它後面沒有出現t,所以匹配到,第二個o表示後面出現了一個t,所以匹配到。
可以看到,所有的行都匹配到,因為行首的r可以不出現,所以,其它的行也都匹配到了。
.*:表示任意多個字元。
+:表示前面的字元,出現1次或者多次。
+,前面的字元出現1次或者多次,不能是0次(即一次都不出現不行)。
grep支援的正則表示式的元字元有限,如果想使用更多的元字元,需使用grep -E或者egrep。
[root@localhost reTest]# cat test
t
to
tom
tommm
tommmmaaa
[root@localhost reTest]#
?:表示前面的字元,出現0次或者1次。
[root@localhost reTest]# cat test
t
to
tom
tommm
tommmmaaa
[root@localhost reTest]#
後面有多個m的也顯示出來了,原因是後面的m被看成是普通的字元了,沒有匹配到,只有匹配到的才紅色顯示。
*可以認為是+和?的結合體。
紅色部分為匹配到的內容。
預設是貪婪匹配,即儘可能多的匹配內容。
懶惰匹配,即儘量少的去匹配內容。
懶惰匹配:
在末尾加上?即可。
可以看到仍然是貪婪匹配。
因為grep,grep –E或者egrep,的正則表示式,不支援懶惰匹配(末尾加上?的方式)方式,因此,讓其使用Perl的正則表示式即可支援懶惰匹配了。
指定-P選項,讓grep使用perl的正則表示式。
可以看到,是儘可能少的去匹配內容。
*表示前面字元出現0次或者多次,那麼最少就是出現0次了。所以,只匹配到to內容。
+?也是同理。
[]:表示中括號中的任意一個字元。注意,只能是1個字元。
匹配[]中的任意單個字元。
[root@localhost reTest]# cat test
t
to
tom
tommm
tommmmaaa
A1122345
a223455
12232344
[root@localhost reTest]#
匹配[]中的A或者a或者5內容。
可以看到,使用懶惰匹配,仍然能夠匹配到aaa和55。
因為從左向右匹配內容的時候,遇到了5,然後看它是[Aa5]中的內容,並且出現了一次,並且是懶惰匹配,因此,匹配到了第一個5,然後會繼續向右匹配內容,同理,匹配到了第二個5,因此,這是發生了兩次匹配過程。而不是貪婪匹配,一次匹配過程就匹配到了55。
[^ ]:當^出現在[]中的時候,表示取反,否定的意思。
\<單詞\>等同於\b單詞\b
\<:表示以某個單詞開頭。
\>:表示以某個單詞結尾。
[root@localhost reTest]# cat test
t
to
tom
tommm
tommmmaaa
A1122345
a223455
12232344
tom jack luce
leo pall fuckyou etc sdfsf
[root@localhost reTest]#
注意,\<表示以某個單詞開頭,不是行首。
注意,\>表示以某個單詞結尾,不是行尾。
精確匹配某個單詞。
單詞:前後兩邊有空格的,當中沒有符號的,就是單詞。與字典中的單詞不是同一個概念。
\(\):分組,反向引用。
分組:即使用\(\)將某個內容括起來。
反向引用:\(\),將關鍵字括起來,後面可以對其再次引用。
\(\)xxxx\(\),這裡會對每個括號中的內容做一個標記。第一個括號中的內容標記為1,第二個括號中的內容標記為2,以此類推。
[root@localhost reTest]# cat test
tomaaabbbtom
leofuckyouleofuckyou
[root@localhost reTest]#
[root@localhost reTest]# cat test
tomaaabbbtom
tombobxxxbobtomtombobxxx
[root@localhost reTest]#
使用-P選項,指定使用perl的正則表示式,此時分組直接寫括號即可。
tom後面有3個字元,然後後面可能又出現了這3個字元,但是不知道這3個字元是什麼的情況下,可以使用分組,後面再引用這3個字元。
\{n\}:表示前面的字元出現n次。
\{n,\}:表示前面的字元最少出現n次,最多不限。
\{n,m\}:表示前面的字元最少出現n次,最多出現m次。
[root@localhost reTest]# cat test
1
12
123
1234
12345
123456
1234567
[root@localhost reTest]#
其它元字元
\d:數字0-9
[root@localhost reTest]# cat test
tom123jac1k
[root@localhost reTest]#
過濾tom後面有數字的,這樣的內容。
\D:非數字
\s:空格,tab,注意,不能夠表示\n
\S:非空格
\w:表示一個字元,可以是,字母(大小寫)、數字、_(下劃線)。注意,不能夠匹配空格。
\W:表示,除了字母(大小寫)、數字、_,之外的內容。
查詢所有非空格的行
grep -P '^\S+$' /etc/yum.conf
查詢含有數字的行
grep -P '.*\d+.*' /etc/yum.conf