Linux基礎之文本處理工具grep及正則表達式(附帶egrep與grep的不同)

文本處理工具grep,正則表達式在Linux學習過程中很容易出現困惑與障礙的地方,這裏分享下學習這方面內容的一些感受。



grep  Global search REgular expression and Print out the line

作用:文本搜索工具,根據用戶指定的‘模式(過濾條件)’對目標文本逐行進行匹配檢查;打印匹配到的行;

‘模式’:由正則表達式的元字符及文本字符所編寫出的過濾條件。

grep [OPTIONS] PATTERN [FILE...]

grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

常用選項:

        -i:忽略字符大小寫

        -o:僅顯示匹配到的字符串本身

        -v:顯示不能被模式匹配到的行

        -E:支持擴展正則表達式元字符

        -q:靜默模式,匹配不顯示

        -A#:after,顯示匹配條件所在行的後#行

        -B#:before,顯示匹配條件所在行的前#行

        -C#:context,顯示匹配條件所在行的前後#行

        -n:顯示匹配的行號(用的較少)

        -c: 統計匹配的行數(用的較少)

下面以幾個小實驗對grep的用法及選項做下具體的演示

實驗目錄/test 文本/test/head

[root@localhost test]# cat head 
12345 Sdabc saber 
Berar bserac
12cds
67890
12
345
123
6

wKioL1enLOHQBBq6AAA8VZfgRn8682.gif



正則表達式:Regual Expression,REGEXP

它由一類特殊字符及文本字符所編寫的模式,其中有些字符不表示其字面意義,而是用於表示控制或通配的功能。

它分兩類:基本正則表達式BRE、擴展正則表達式ERE


基本正則表達式元字符:

包括:字符匹配匹配次數位置錨定分組


字符匹配

    . :匹配任意單個字符;        [] :匹配指定範圍內的任意單個字符

    [^] :匹配指定範圍外的任意單個字符

    常用集合:[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]

wKiom1enJHPSbB2mAAAOAbMrRZ4951.gif

wKioL1enJHSBRYXkAAAOp5xCHD0739.gif

wKiom1enJHTidiqIAAANM23CGag486.gif


匹配次數:用在要指定次數的字符後面,用於指定前面的字符要出現的次數

    *:匹配前面的字符任意次,包括0次;貪婪模式:儘可能長的匹配

    .*:任意長度的任意字符

    \?:匹配其前面的字符0或1次

    \+:匹配其前面的字符至少1次

    \{m\}:匹配前面的字符m次

    \{m,n\}:匹配前面的字符至少m次,至多n次

    \{,n\}:匹配前面的字符至多n次

    \{m,\}:匹配前面的字符至少m次

wKioL1enJU_hYm2UAAAh7gQ1Uh8244.gif


位置錨定:定位出現的位置

    ^:行首錨定,用於模式的最左側

    $:行尾錨定,用於模式的最右側

    ^PATTERN$: 用於模式匹配整行

    ^$: 空行

    ^[[:space:]]*$ :空白行

單詞:非特殊字符組成的連續字符在Linux看來都稱單詞

    \< 或\b:詞首錨定,用於單詞模式的左側

    \> 或\b:詞尾錨定;用於單詞模式的右側

    \<PATTERN\>:匹配完整的單詞

wKiom1enKfmg9DkTAAAN_-0PJok776.gif

1、查找以for開頭的行

wKiom1enKfrRZcIhAAAMy8Leg-M242.gif

2、檢索只含有for的字符串;檢索含有for的內容

wKiom1enKfqhfPVHAAAXAecfD08440.gif

3、檢索以for結尾的行;檢索以for結尾的字符串

wKioL1enKfrhkNqvAAAUSl5w1lg347.gif


分組\(\):將一個或多個字符捆綁在一起,當作一個整體進行處理,如:\(root\)\+

分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些變量的命名方式爲: \1, \2, \3, ...

\1: 從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符;

實例:\(string1\+\(string2\)*\)

\1: string1\+\(string2\)*

\2: string2

後向引用:引用前面的分組括號中的模式所匹配字符(而非模式本身)

wKioL1enK2mg9G-HAAAM4T6H4HY417.gif

上述命令意思是檢索包含有for字符串後跟任意字符且出現一次,連續出現上述情況兩次截取結果。後面的\1是重複第一個括號內的檢索對象。



egrep= grep -E

egrep[OPTIONS] PATTERN [FILE...]

擴展正則表達式的元字符:


字符匹配:同基本正則表達式


次數匹配:

    *:匹配前面字符任意次

    ?: 0或1次

    +:1次或多次

    {m}:匹配m次

    {m,n}:至少m,至多n次


位置錨定:同基本正則表達式


分組:

    ()

    後向引用:\1, \2, ...


或者:

    a|b

    C|cat: C或cat

    (C|c)at:Cat或cat



最後我們通過9個例子來感受grep與正則表達式結合所能實現的功能

1、顯示/proc/meminfo文件中以大小s開頭的行

wKioL1enOhTjFKj3AAAZ2eDQ6FQ131.gif

這個只需要知道grep的選項i就能輕鬆解決。


2、顯示/etc/passwd文件中不以/bin/bash結尾的行

wKiom1enOiWhEjtbAABldH1yAcU272.gif

先使用grep檢索出包含有以“/bin/bash”結尾的行,再使用grep的-v取不以上面結果的行。類似數學中的補集效果。


3、找出ifconfig命令結果中本機的所有IPv4地址

wKioL1enOjiRNyOvAAA3quiV3Y0006.gif

這個分爲三步:

1)通過grep鎖定包含有IPV4的行,這個通過分析ifconfig列出的信息可以看出規律,只要包含有IPv4的開頭都有inet這個字母,所以我們只需要檢索它就行了

2)接下來使用tr將所有空替換爲“:”並壓縮

3)使用cut實現結果。


4、查出分區空間使用率的最大百分比值

wKiom1enOmSgiGVhAAByMj9e38k462.gif

wKioL1enOmXh5z0yAAAvcobvGfo647.gif

這個大致分6步:

1)過濾漢字

2)使用tr替換所有空爲":"並壓縮

3)使用cut剪切出含有使用率百分比的數值

4)再次使用tr剔除%

5)使用sort按數值大小寫排序

6)使用tail取出最大值


5、顯示用戶rpc默認的shell程序

wKiom1enOnbgCk-MAAAXCtu3GCc540.gif

上面的檢索條件是以rpc爲行首且以它爲字符結尾的行


6、找出/etc/passwd中的兩位或三位數

wKioL1enOoawqYciAADHo1B8ojs316.gif

這裏使用的是擴展正則表達式因爲可以是表達式更簡潔

這裏需要注意的是要以兩位或三位數爲字符串,這需要對其進行開頭與結尾的字符錨定


7、找出/etc/rc.d/init.d/functions文件中行首爲某單詞(包括下劃線)後面跟一個小括號的行

wKiom1enOpeQbOJyAAAvRCxLKdk216.gif

當我們想好要過濾的條件後,要對其進行行首及字符的錨定,否則會導致條件範圍不嚴謹

這裏要注意的是.*\>\(\),如果這裏改寫爲.*\(\)\>則會失敗,具體可以自己想想。其實.*已經包括了"()",所以後面的是重複的,這樣就容易出錯


8、使用egrep取出/etc/rc.d/init.d/functions中其基名

wKioL1enOqqhsZk8AAAXnJhJ6zU480.gif

wKiom1enOqrBIWfSAAAbhMWWp5g365.gif

上面是兩種方法,一種利用grep直接檢索出來,另一種的思想是分割。各有特點


9、利用擴展正則表達式分別表示0-9、10-99、100-199、200-249、250-255

\<[0-9]\>:0-9

\<[1-9][0-9]|>:10-99

\<1[0-9][0-9]\> | \<1[0-9]{2}\>:100-199

\<2[0-4][0-9]\> :200-249

\<25[0-5]\>:250-255


上面只是對grep及正則表達式的簡要總結,不過只要掌握好這基本的內容自己也就可以進行更深入的學習了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章