歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux教程

grep,egrep 及正則表達式

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

Copyright © Linux教程網 All Rights Reserved