首頁 > 軟體

grep,egrep 及正規表示式

2020-06-16 17:53:12

Linux中一切皆檔案:文字檔案,對文字檔案的搜尋就非常的關鍵和常用。

Linux文字搜尋工具:grep ,egrep,fgrep,文字搜尋指文字檔案中內容的搜尋。

檔名的搜尋是linux中bash的特性,globbing,檔名通配,有點windows中的搜尋相似,但功能跟強大。一般配合 ls 命令使用。可參考視訊:bash基礎特性(01)

globbing:中的元字元: *:用來通配任意長度任意字元,?:用來匹配單個字元,[]:用於比配指定範圍內的字元,[^]:用於取反範圍內的字元。

總結:globbing檔名通配:既限定了長度,又限定了可用的字元範圍。

既然要搜尋,必須有過濾條件,這裡就要用到正規表示式,他是linux 文字處理工具的非常基礎和重要。

正規表示式(過濾條件)正規表示式中的元字元,以正常字元組合而成。

基本正規表示式:grep

擴充套件正規表示式:egrep ,grep E,

                fgrep:fast,不支援使用正規表示式

grep : Global search Regular expression and print out the line

grep 命令:

    grep  [OPTION] PATTEN [FILE…]

        --color =auto

        -o :只顯示被過濾模式匹配到的內容

        -i  :搜尋時不區分字元大小寫 grep "no"

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

這裡用到grep的一個引數--color,color有三個值供選擇:never、always、auto。always和auto的區別就是,always會在任何情況下都給匹配欄位加上顏色標記,當通過管道或重定向時就會多出一些控制字元,結果會變成
export ^[[1;32m^[[KGREP^[[m^[[K_OPTIONS='--color=always'
export ^[[1;32m^[[KGREP^[[m^[[K_COLOR='1;32'
而auto則只在輸出到終端時才加上顏色。
可以在.bashrc裡加上
export GREP_OPTIONS='--color=auto'
來實現高亮匹配,具體用什麼顏色,可以通過
export GREP_COLOR='a;b' #預設是1;31,即高亮的紅色
來設定,其中:
a:可以選擇:【0,1,4,5,7,8】    b: 可選擇:

0 關閉所有屬性                    30 black                 
1 設定高亮度                      31 red

4 下劃線                              32 green

5 閃爍                                  33 yellow

7 反顯                                  34 blue

8 消隱                                  35 purple

                                            36 cyan

                                            37 white                                           

基本正規表示式元字元:

字元匹配:

      .  :配任意單個字元

      []  :配指定範圍內的任意單個字元

      [^] :匹配指定範圍外的任單個字元,相當於[]取反

          [0-9],[[:digit :]],[^0-9][^[:digit :]]

            [a-z],[[:lower:]]

            [A-Z],[[:upper:]]

            [[:space:]]  空格符

          [[:punct :]] 標點符號

          [0-9a-z A-Z],[[:alnum :]]

            [a-zA-Z],[[:alpha:]]

次數匹配:在期望匹配的字元後面提供一個控制符,用於表達匹配其前面字元指定的次數

      *:用於匹配左側字元任意長度,表示0次,1次或多次

        "ab*c"=ac,or,abbc,or abbbc,or abbbbc

      .*:任意長度任意字元,預設工作於貪婪模式,

    ?:匹配其前的字元,匹配0次或1次,表示其左側字元可有可無

        "ab?c"=ac,或abc

      +:匹配前面(左側)字元1次或多次

        "ab+c"=abc,abbc,abbbc

      {m}:精確匹配左側字元m次 。ab{2}c=abbc

      {m,n}:至少m次,至多n次。ab{0,3}c=ac,abc,abbc,abbbc

      {0,3}:最多3次

    {m,}:最少m次

錨定位置的字元》匹配位置的限定:

      ^:錨定行首。^ab

      $:錨定行尾。ab$

      "^ab.*ba$":以ab開頭中間任意字元以ab結尾

      "^$":匹配空白行 , grep "^$" /etc/rc.d | wc l 表示統計空白行數

      "^PATTERN$:用於匹配整行。"^a4*$"

      單詞錨定:由非特殊字元組成的連續的字串

        <:錨定詞首,也可b  # grep "<ab"/etc

        >:錨定詞尾,也可b  # grep "ab>"/etc

        <PATTERN>:匹配PATTERN能匹配到的整個單詞

      #  ifconfig | grep "<[0-9]{2}>":精確匹配2位數位單詞

分組:()

    分組的小括號中的模式匹配到的內容,會在執行過程中被正規表示式引擎記錄下來,並儲存內建的變數中;這些變數分別是1, 2, ...

1: 從左側起,第一個左括號,以及與之配對的右括號中間的模式所匹配到的內容; 2以此類推。

#"(ab)*c"

擴充套件正規表示式的元字元:

字元匹配:同基本正規表示式

次數匹配:

*: 0次或多次

?: 0次或1次;

+: 1次以上;

{m}: 精確匹配m次;

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

錨定:

^: 錨定行首

$: 錨定行尾

<, b: 詞首錨定;用於表示單詞的模式的左側;

>, b:詞尾錨定;用於表示單詞的模式的右側;

分組:

同基本正規表示式

( )

支援或的概念

a|b:匹配a或者b

練習:

1、顯示/etc/passwd檔案中以bash結尾的行

# grep “bash$”/etc/passwd

# grep –E “bash$”/etc/passwd

# egrep “bash$” /etc/passwd

2、顯示/etc/passwd檔案中的兩位數或三位數

# grep “<[[:digit:]]{2,3}>”/etc/passwd

# egrep “<[0-9]{2,3}>”/etc/passwd

3、顯示`netstat -tan`命令結果中以‘LISTEN’後跟0個、1個或者多個空白字元結尾的行

  # netstat –tan | grep “LISTEN[[:space:]]*$”

  # netstat –tan | egrep “LISTEN[[:space:]]*$”

4、新增使用者bash、testbash、basher以及nologin使用者(nologin使用者的shell為/sbin/nologin);而後找出/etc/passwd檔案中使用者名稱與其shell名相同的行

# grep "^([[:alnum:]]+>).*1$" /etc/passwd

# egrep "^([[:alnum:]]+>).*1$" /etc/passwd

5、顯示當前系統上root、CentOS或者user1使用者的預設shell和UID (請事先建立這些使用者,若不存在)

# grep -E "^(root|centos|user1)>" /etc/passwd |cut -d:-f3,7

# egrep  "^(root|centos|user1)>"/etc/passwd |cut -d: -f3,7

6、找出/etc/rc.d/init.d/functions檔案中某單詞(單詞中間可以存在下劃線)後面跟著一組小括號的行

# egrep -o "<[[[:alnum:]_]+>()"/etc/rc.d/init.d/functions

7、使用echo輸出一個路徑,而後egrep找出其路徑基名;進一步的使用egrep取出其目錄名

# echo/etc/sysconfig/network-scripts/ | egrep -o "[[:alnum:]-]+/?$"

# echo /etc/sysconfig/network-scripts| egrep -o "(/.*/)"

8、找出ifconfig命令執行結果中1-255之間的數位

# ifconfig | egrep"<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])>"

Linux 基礎入門教學----正規表示式基礎   http://www.linuxidc.com/Linux/2015-08/121441.htm

Linux正規表示式sed 詳述  http://www.linuxidc.com/Linux/2015-04/116309.htm

Linux正規表示式特性及BRE與ERE的區別 http://www.linuxidc.com/Linux/2014-03/99152.htm

grep使用簡明及正規表示式 http://www.linuxidc.com/Linux/2013-08/88534.htm

正規表示式的用法 http://www.linuxidc.com/Linux/2013-03/81897.htm

正規表示式之零寬斷言 http://www.linuxidc.com/Linux/2013-03/81897.htm

Linux中正規表示式與檔案格式化處理命令(awk/grep/sed) http://www.linuxidc.com/Linux/2013-03/81018.htm

基礎正規表示式 http://www.linuxidc.com/Linux/2014-09/106296.htm

常用正規表示式整理 http://www.linuxidc.com/Linux/2014-10/108076.htm

本文永久更新連結地址http://www.linuxidc.com/Linux/2015-09/122971.htm


IT145.com E-mail:sddin#qq.com