1. 程式人生 > 實用技巧 >shell-正則表示式

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次或者多次。

注意,和萬用字元中的所表示的意義不同。
這裡

的意思表示它前面的那個字元可以出現任意多次,任意既可以是0次,也可以是n次。

例子中,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