溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

grep系及正則表達(dá)式的應(yīng)用

發(fā)布時(shí)間:2020-06-29 09:58:22 來(lái)源:網(wǎng)絡(luò) 閱讀:442 作者:TWJDavid 欄目:網(wǎng)絡(luò)安全

上周講了一個(gè)非常重要的內(nèi)容,老師反復(fù)叮囑一定要先寫關(guān)于這個(gè)的博客,那么我們就先講一下文本編輯工具里面的grep系及正則表達(dá)式元字符的使用,首先先講一下什么是grep系


grep系:grep、egrep、fgrep

其中最主要的還是grep


grep:Global search Regular Expression and Print out the line

      利用正則表達(dá)式進(jìn)行全局查找并將匹配的行顯示出來(lái);


 如果想要理解這句話我覺得最好我們先看一下什么是正則表達(dá)式的元字符,我們用PATTERN來(lái)表示


 字符匹配類:

    .:表示匹配任意單個(gè)字符     

    例:.abcd就是指的是以任意字符開頭后面是abcd的所有結(jié)果比如1abcd等

    []:匹配指定范圍內(nèi)的任意單個(gè)字符

    例:配合字符集使用,比如[:lower:]表示的就是匹配小寫字母中的任意一個(gè)字母

    [^]:匹配指定范圍以外的任意單個(gè)字符

    這個(gè)應(yīng)該不用舉例,和上一個(gè)相反就對(duì)了

    下列所有的字符集都可以放在中括號(hào)里面用于匹配單個(gè)字符

    [:lower:]:

    [:upper:]:

    [:alpha:]:

    [:digit:]:

    [:space:]:

    [:alnum:]:

    [:punct:]:

    [:blank:]:

    [:xdigit:]:所有的十六進(jìn)制數(shù)字;

    a-z:所有的小寫字符

    A-Z:所有的大寫字母

    0-9:標(biāo)識(shí)所有的十進(jìn)制字符

注意:這里的a-z指的就是所有的小寫字母,不再是之前所說(shuō)的a,A,b,...,z


次數(shù)匹配:該類字符之前的那個(gè)字符可以出現(xiàn)的次數(shù)

*:其前面的字符可以出現(xiàn)任意次(0次、一次、多次)

例:a*bc就表示,bc前面可以出現(xiàn)任意次a,可以是0次,可以是1次,也可以是多次

\?:其前面的字符可有可無(wú)(0次或1次)

例:a\?bc就表示,bc前面只可以出現(xiàn)0次或1次a,注意:在?前加轉(zhuǎn)義字符\是為了防止shell把?當(dāng)作bash變量來(lái)處理,后面的\也是如此

\+:其前面的字符至少出現(xiàn)一次(1次或多次)

例:a\+bc就表示,bc前面至少出現(xiàn)一次a,也可以是多次

\{m\}:其前面的字符必須出現(xiàn)m次

例:a\{m\}bc表示,bc前面必須出現(xiàn)m次a

\{m,n\}:其前面的字符至少出現(xiàn)m次,至多出現(xiàn)n次

例:a\{m,n\}bc表示bc前面最少出現(xiàn)m次a,最多出現(xiàn)n次a

\{,n\}:其前面的字符至多出現(xiàn)n次

例:a\{,n\}bc表示bc前面最多可以出現(xiàn)n次a

\{m,\}:其前面的字符至少出現(xiàn)m次,×××

例:a\{m,\}bc表示bc前面至少出現(xiàn)m次a


在正則表達(dá)式中,表示任意長(zhǎng)度任意字符的方式:.*

例:.*abc就表示只要是以abc結(jié)尾,前面可以是任意長(zhǎng)度任意字符的東西



位置錨定字符:

  行錨定:

    行首錨定:^

    行尾錨定:$


  字錨定:

    字首錨定:\<或\b

    字尾錨定:\>或\b

    \b:舊版本中的錨定方法,建議不使用


關(guān)于行首錨定和字錨定我們?cè)诤竺娴睦}中再詳細(xì)解釋    


    在正則表達(dá)式中,字是由非特殊字符組成的連續(xù)字符串。  


  分組與引用字符:

  \(PATTERN\):將PATTERN匹配到的所有字符當(dāng)作一個(gè)不可分割的整體來(lái)處理


  分組很好理解,就是把由一串字符組成的東西當(dāng)作一個(gè)整體在計(jì)算機(jī)中尋找匹配


  在正則表達(dá)式引擎當(dāng)中,有一系列的內(nèi)置變量,這些變量會(huì)保存所有分組內(nèi)的字符信息,用于后向引用,這些變量依次是\1,\2,\3...


  PATTERN1\(PATTERN2\)PATTERN3\(PATTERN4\(PATERN5\))


  \1:PATTERN2

  \2:PATTERN4

  \3:PATTERN5



\1:第一組小括號(hào)中PATTERN匹配到的字符

\2:第二組小括號(hào)中PATTERN匹配到的字符

\3:第三組小括號(hào)中PATTERN匹配到的字符


關(guān)于引用,最簡(jiǎn)單的解釋就是你之前已經(jīng)使用過(guò)的字符串在后面的表達(dá)式中如果再用到的話,你可以不打出來(lái),而只用一個(gè)符號(hào)來(lái)代替,第一個(gè)出現(xiàn)的就用\1表示,第二個(gè)字符就用\2表示,依次類推





例:請(qǐng)找出在/etc/passwd 中用戶的UID和GID相同的用戶賬戶;

首先我們來(lái)分析一下,用戶的UID和GID都是一串?dāng)?shù)字,所有我們想到可以用數(shù)字字符集來(lái)匹配,然后再來(lái)分析用戶的UID和GID一般都是由幾個(gè)數(shù)字組成,所以我們可以用\+來(lái)實(shí)現(xiàn),然后要求GID和UID一樣我們只需表示出GID,直接飲用表示UID就可以了,所以具體的命令格式應(yīng)該是下面這種格式。


grep '\(\<[[:digit:]]\+\>\).*\1' /etc/passwd



或:

\|

注意:或字符將其兩邊的字符串當(dāng)作整體對(duì)待;

A\|american:A或american


怎么理解把兩邊的字符串當(dāng)作整體來(lái)對(duì)待,就是比如上面這個(gè)例子A\|american表示A或american而不是A或a,然后接上merican


我們?cè)賮?lái)看一個(gè)例子:


請(qǐng)找出ifconfig執(zhí)行結(jié)果中數(shù)值在100-255之間的整數(shù);


第一位:1 2

第二位:0-9 0-4 5

第三位:0-9 0-9 0-5


這個(gè)問(wèn)題難點(diǎn)不在PATTENR的表示,在于分析這個(gè)整數(shù)的特點(diǎn),只要分析明白了,這個(gè)問(wèn)題就很好解決


ifconfig | grep '\<\(1[0-9][0-9]\|2[0-4][0-9]\25[0-5]\)\>'


說(shuō)完正則表達(dá)式的元字符,我們接著來(lái)說(shuō)grep系的具體用法

grep [OPTIONS] PATTERN [FILE...]

PATTERN:過(guò)濾條件,是由正則表達(dá)式元字符以及沒有特殊含義的文本字符組成

  正則表達(dá)式的元字符:

     會(huì)被正則表達(dá)式的引擎解釋為特殊含義;

     pcre--perl語(yǔ)言的正則表達(dá)式引擎;


     基本的正則表達(dá)式:BRE

     擴(kuò)展的正則表達(dá)式:ERE


grep默認(rèn)僅支持基本正則表達(dá)式;

egrep默認(rèn)支持?jǐn)U展正則表達(dá)式;

fgrep默認(rèn)不開啟正則表達(dá)式引擎;



  文本字符:

     只具備字符表面含義的那些字符;


常用選項(xiàng):

-i --ignore-case 忽略文本字符的大小寫

-v --invert-match 反向匹配,最終顯示的結(jié)果是PATTERN不能成功匹配的行

-c --count 計(jì)數(shù),統(tǒng)計(jì)匹配PATTERN的所有行數(shù)

-o, --only-matching 關(guān)閉貪婪模式,僅顯示PATTERN匹配的內(nèi)容

-q, --quiet, --silent 安靜模式,不輸出任何匹配結(jié)果,用于邏輯判斷

--color[=WHEN], --colour[=WHEN]:將匹配PATTERN的字符以特殊顏色高亮顯示

  --color+auto

-E, --extended-regexp 擴(kuò)展的正則表達(dá)式,grep -E相當(dāng)于egrep

-F, --fixed-strings, --fixed-regexp 基本的正則表達(dá)式,egrep -F 相當(dāng)于fgrep

-G, --basic-regexp:基本的正則表達(dá)式 egrep -G相當(dāng)于grep

-P, --perl-regexp:使用PCRE引擎

-A NUM, --after-context=NUM:在顯示匹配PATTERN的行的同時(shí)顯示其后面的NUM行

-B NUM, --before-context=NUM:在顯示匹配PATTERN的行的同時(shí)顯示其前面的NUM行

-C NUM, -NUM, --context=NUM:在顯示匹配PATTERN的行的同時(shí)顯示其前后的NUM行



關(guān)于grep的用法其實(shí)和命令的學(xué)習(xí)是差不多的,就是先記得滾瓜爛熟再配合操作鞏固就好了,接下來(lái)說(shuō)egrep和fgrep就很好理解了,egrep相對(duì)于grep的區(qū)別就是在使用正則表達(dá)式元字符的時(shí)候可以不用轉(zhuǎn)義字符


egrep:

egrep [OPTIONS] PATTERN [FILE...]

擴(kuò)展的正則表達(dá)式元字符:

字符匹配:

.

[]

[^]


次數(shù)匹配:

*

?

+

{}

{m,n}

{m,}

{,n}


位置錨定字符

^

$

\<,\b

\>,\b


分組和引用

()

\1,\2,\3


或:

|


fgrep:PATTERN中所有的字符都被當(dāng)作文本字符來(lái)處理


關(guān)于fgrep,只是把PATTENR解釋為純文本,不再用正則表達(dá)式對(duì)其進(jìn)行解釋,有利用提高搜索的速度


關(guān)于grep系和正則表達(dá)式元字符就介紹到這,這是很重要的文件處理只是,大家必須好好理解,吸收掌握。


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI