前言:
正則可以實(shí)現(xiàn)一些簡(jiǎn)單的功能,并用在腳本中,如檢測(cè)ip地址是否符合規(guī)范,檢測(cè)文件名是否符合規(guī)范等等。
正則表達(dá)式
正則表達(dá)式主要是用來(lái)描述一個(gè)句法規(guī)則的模式。其實(shí)說(shuō)的通俗一點(diǎn),就是利用字符和元字符的組合,對(duì)一些符合既定句法的模式進(jìn)行模糊匹配。它的主要功能是文本查詢(xún)和字符串操作。
正則表達(dá)式的基本元素包括普通字符和元字符,在Linux shell里面,常用的正則表達(dá)式元字符集為:S={* . ^ $ [] \&; \\> \{\} \{n,\} \{n,m\} },每一個(gè)元字符都有自己在正則表達(dá)式中的含義,下面來(lái)介紹一下:
“ * ”符號(hào):表示匹配前面一個(gè)普通字符0次或多次。注意這里是一個(gè)普通字符,即如果是JO*B的話(huà),那么*就匹配字符“O”任意次,而不是匹配“JO”串。
“ . ”符號(hào):表示匹配任意一個(gè)字符。字符“ . "就表示一個(gè)字符,這個(gè)字符可以是任意字符。例如字符串 ...73 就表示前面3個(gè)字符為任意字符(包括空格),第4個(gè)和第5個(gè)字符分別是7和3。
“ ^ ”符號(hào):表示匹配行首。例如:^cloud就表示匹配以cloud字符串開(kāi)頭的所有行。與上面匹配一個(gè)字符不一樣,這里匹配的是后面跟著的整個(gè)字符串。
” $ "符號(hào):表示匹配行尾。例如:cloud$ 就表示匹配以cloud字符串結(jié)尾的所有行。結(jié)合上面的匹配行首,^$表示匹配空行。
“ [] "符號(hào):表示匹配方括號(hào)里面的字符集中的一個(gè)。例如:數(shù)字0-9中的任意一個(gè)數(shù)字都滿(mǎn)足[0-9]這個(gè)表達(dá)式。值得注意的是,當(dāng)^放在[]里面的時(shí)候,^就不再表示行首,而是表示取反。如:[^7-9]則表示非7-9中的任意一個(gè)數(shù)字才滿(mǎn)足這個(gè)表達(dá)式。
” \ “符號(hào):是轉(zhuǎn)義字符。如果你寫(xiě)的正則表達(dá)式里面包括元字符,而你又想將它當(dāng)做普通字符用的話(huà),就要在前面加上轉(zhuǎn)義符號(hào)" \ "了。例如:\$就表示一個(gè)普通字符”$"。
“\\>"符號(hào):表示精確匹配>內(nèi)的字符,” \ “是用來(lái)轉(zhuǎn)義>這兩個(gè)字符的。例如:\the\&;表示匹配包含”the“的行,由于精確匹配,所以,”them“,”theory“這些單詞所在的行并不會(huì)被匹配到。
”\{\}"符號(hào):與" * "類(lèi)似,表示匹配前面的一個(gè)字符任意多次。但是“\{\}”可以指定重復(fù)的次數(shù),如\{3\}則表示重復(fù)前面的字符3次;\{3,\}表示重復(fù)前面的字符至少3次;\{3,5\}表示重復(fù)3到5次。例如:JO\{3\}B則表示重復(fù)字符O三次,即JOOOB;JO\{3,\}B則表示至少重復(fù)O三次,即JOOOB,JOOOOB等都符合;\{3,5\}則匹配JOOOB,JOOOOB,JOOOOOB這幾個(gè)字符串。
通配符
初學(xué)的時(shí)候?qū)τ谡齽t表達(dá)式和通配符的理解很模糊,兩個(gè)都是可以進(jìn)行模糊匹配的,到底什么時(shí)候用才是正則表達(dá)式,什么時(shí)候用是通配符呢?其實(shí),我們登錄系統(tǒng)之后,系統(tǒng)的bash shell并不支持正則表達(dá)式的,也就是說(shuō),我們?nèi)绻褂胋ash shell的某些命令時(shí)使用正則表達(dá)式,shell可能會(huì)認(rèn)不出來(lái),只有當(dāng)我們使用類(lèi)似grep,sed,awk等工具的時(shí)候才有效。所以,我們?cè)谑褂胋ash shell的時(shí)候也想達(dá)到模糊匹配的目的的話(huà),就要使用通配符了。
通配符是使用正則表達(dá)式的一些元字符來(lái)的,常用的元字符集:E={? * [] {} ^ }。不過(guò),這個(gè)通配符的元字符意義跟正則表達(dá)式里面的不太一樣。例如:
“ * "字符不再表示匹配前面一個(gè)字符任意多次,而是表示任意位置的任意字符。例如:phi*ip,則可以匹配philip,phillip,philsaip等開(kāi)始三個(gè)是phi和結(jié)尾兩位是ip的任意字符。例如ls -l *.awk表示匹配以.awk結(jié)尾的所有文件,*表示任意長(zhǎng)度任意字符組合。
" ? ”字符才表示任意一個(gè)字符。同正則表達(dá)式元字符的" . "
" {} “字符不需要轉(zhuǎn)義。在{}表示的是表達(dá)式集合。如:ls -l {[a-h]*.awk,0?.pem}則表示列出所有以a-h字符開(kāi)頭的.awk文件的和以0開(kāi)頭,后面接一個(gè)任意字符的.pem文件
" ^ "字符也不是表示行首,而是代表取反。
正則表達(dá)式和通配的應(yīng)用環(huán)境上有些不一樣,但是都能夠達(dá)到模糊匹配的效果。在后面介紹到的使用grep,sed和awk等工具對(duì)于文件的查找以及各種操作中,正則表達(dá)式的匹配作用更加明顯。
范例:
檢測(cè)文件名是否符合規(guī)范:
#!/bin/bash
RED='\033[31m'
GREEN='\033[32m'
awk '{printf("%s",$0)}' $1 | egrep "^#[[:digit:]]*-(docs|unittest|pseudocode|msg-[^ ].*)$" > /dev/null 2>1
if [ $? -ne 0 ];then
echo -e "message check ${RED}fail${NORMAL}"
exit 1
fi
echo -e "message check ${GREEN}success${NORMAL}"
exit 0
當(dāng)然,也可以使用if,如:
if [[ $1 =~ ^[0-9]+$ ]]; then
echo "Is Number."
else
echo "No Number."
fi
檢測(cè)ip地址是否符合規(guī)范:
構(gòu)造測(cè)試文件 ip.txt
10.1.1.1
192.168.0.1
192.168.0.101
255.255.255.255
999.0.0.1
1.0.0.500
a.0.0.0
0.b.0.0
1.1.1
2.2
1
0.0.0.0
基本思路就是要每個(gè)點(diǎn)之間的元素為整數(shù),最多為3位整數(shù)[0-9]\{1,3\},然后用 . 拼接起來(lái),加上^和$更精確的限制匹配對(duì)象
cat ip.txt |grep '^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$'
結(jié)果為
10.1.1.1
192.168.0.1
192.168.0.101
255.255.255.255
999.0.0.1
1.0.0.500
0.0.0.0
這里精度不夠,需要嚴(yán)格限制整數(shù)為1-255(第一個(gè)元素不能為0,后面的可以為0),即0-9 10-99 100-199 200-249 250-255
\([1-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)
注意|和()轉(zhuǎn)義,另外|分割的元素要用()括住,若帶-E參數(shù)指定為擴(kuò)展正則的形式則不需用\轉(zhuǎn)義
然后后面3個(gè)元素只要稍改下范圍到0-255,簡(jiǎn)單的拼接起來(lái)
復(fù)制代碼 代碼如下:
cat ip.txt |grep '^\([1-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\.\([0-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\.\([0-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\.\([0-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)$'
結(jié)果如下
10.1.1.1
192.168.0.1
192.168.0.101
255.255.255.255
當(dāng)然更簡(jiǎn)潔的寫(xiě)法,記得.后面的元要()括起來(lái)
復(fù)制代碼 代碼如下:
cat ip.txt |grep '^\([1-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\(\.\([0-9]\|([1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\)\{3\}$'
到此這篇關(guān)于shell模糊匹配與正則詳解的文章就介紹到這了,更多相關(guān)shell模糊匹配與正則內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- shell通過(guò)正則匹配ip地址實(shí)例代碼
- Shell腳本中通過(guò)正則表達(dá)式匹配IP地址
- shell腳本正則匹配文件中的Email并寫(xiě)入到文件中代碼分享