grep,egrep及相應的正則表達式用法詳解

目錄

1、grep簡介

    1.1、grep是什么

    1.2、grep使用格式

    1.3、grep常用選項

2、正則表達式與grep

    2.1、正則表達式簡介

    2.2基本正則表達式grep

    2.3、擴展正則表達式grep -E、egrep

     2.4、fgrep


1、grep簡介

    1.1、grep是什么

                  grep (Global search REgular expression and Print out the line)

                    作用:文本搜索工具,根據用戶指定的文本模式(正則表達元字符以及正常字符組合而成)對目標文件進行逐行搜索,顯示能匹配到的行;    

                    模式:由正則表達式的原字符及文本字符所編寫的過濾條件;

    

    1.2、grep使用格式

                    grep [OPTIONS] PATTERN [FILE…]

                            [root@localhost ~]# grep "UUID" /etc/fstab 

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

                        [root@localhost ~]# grep -e "UUID" /etc/fstab 

                 

    1.3、grep常用選項

                OPTIONS:

                    –color=auto:對匹配到的文本著色后高粱顯示;

                    -i, –ignore-case:忽略字符的大小寫;

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

                    -v, –invert-match:顯示不能被模式匹配到的行;

                    -E:支持使用擴展的正則表達式元字符;

                    -q, –quiet, –silent:靜默模式,即不輸出任何信息;

                    -A #:after,后#行

                    -B #:before,前#行

                    -C #:context,前后各#行


2、正則表達式與grep

    2.1、正則表達式簡介

              正則表達式:Regual Expression,REGEXP

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

                元字符:\(hell0[[:space:]]\+\)\+

                分兩類:

                        基本正則表達式:BRE

                        擴展正則表達式:ERE

    2.2、基本正則表達式與grep

                基本正則表達式元字符:

                                    字符匹配:

                                            . :匹配任意單個字符;

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

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

                                            [:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]


                                    匹配次數:用在要指定其出現的次數的字符的后面,用于限制其前面字符出現的次數;默認工作于貪婪模式;

                                            *:匹配其前面的字符任意次;0,1,多次;

                                                例如:grep "x*y"

                                                           abxy

                                                           aby

                                                           xxxxxy

                                                           yab

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

                                            \?:匹配其前面的字符0次或1次;即其前面的字符是可有可無的;

                                                例如:grep "x\?y"

                                                           abxy

                                                           aby

                                                           xxxxxy

                                                           yab

                                            \+:匹配其前面的字符1次或多次;即其前面的字符要出現出現至少1次;

                                                例如:grep "x\+y"

                                                           abxy

                                                           xxxxxy

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

                                                例如:grep "x\{2\}y"

                                                           xxxxxy

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

                                            \{0,n}:至多n次

                                            \{m,\}:至少m次

                                                例如:grep "x\{1,5\}y"

                                                           abxy

                                                           xxxxxy

                                位置錨定:

                                            ^:行首錨定;由于模式的最左側;

                                            $:行尾錨定;用于模式的最右側;

                                            ^PATTERN$:用PATTERN來匹配整行;

                                            ^$:空白行;

                                            ^[[:space:]]*$:空行或包含空白字符的行;

                                單詞:非特殊字符組成的連續字符(字符串)都稱為單詞;

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

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

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


                                練習:

                                    1、顯示/ect/passwd文件中不以/bin/bash結尾的行;

                                        [root@localhost ~]# grep -v "/bin/bash$" /etc/passwd

                                    2、找出/etc/passwd文件中兩位數或三位數;

                                        [root@localhost ~]# grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd

                                        [root@localhost ~]# egrep "\<[0-9]{2,3}\>" /etc/passwd

                                    3、找出/etc/rc.d/rc.sysinit或/etc/group2.cfg文件中,以至少一個空白字符開頭,且后面非空白字符的行;

                                        [root@localhost ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg

                                    4、找出"netstat -tan"命令的結構中以'LISTEN'后跟0、1或多個空白字符結尾的行;

                                        [root@localhost ~]# netstat -tan | grep "LISTEN[[:space:]]*$"


                                分組及引用

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

                                        \(xy\)*ab

                                    Note:分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄于內部的變量中,這些變量為:

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

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

                                        \3

                                        …

                                        He likes his lover.

                                        He loves his lover.

                                        She likes her liker.

                                        She loves her lover.


                                        grep "\(l..e\).*\1" lovers.txt


                                后向引用:引用前面的分組括號中的模式所匹配到的字符;

    2.3、擴展正則表達式grep -E、egrep

        egrep:

                        支持擴展的正則表達式實現類似grep文本過濾功能;grep -E

                        egrep [OPTIONS] PATTERN [FILE…]

                    選項:

                        -i, -o, -v, -q, -A, -B, -C

                        -G:支持基本正則表達式

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

                    字符匹配

                        . :任意單個字符

                        []:指定范圍內的任意單個字符

                        [^]:指定范圍外的任意單個字符

                    次數匹配

                        *:任意次,0,1或多次;

                        ?:0次或1次,其前的字符是可有可無的;

                        +:其前字符至少1次

                        {m}:其前的字符m次

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

                        {0,n}

                        {m,}

                    位置錨定

                        ^:行首錨定;

                        $:行尾錨定;

                        \<,\b:詞首錨定;

                        \>,\b:詞尾錨定;

                    分組及引用

                        ():分組;括號內的模式匹配到的字符會被記錄于正則表達式引擎內部變量中;

                        后向引用:\1, \2 …

                        或:

                            a|b:a或者b;

                                C|cat:C或者cat

                                (C|c)at:Cat或者cat

                        練習:

                            1、找出/proc/meminfo文件中,所有以大寫或小寫s開頭的行,至少有三種實現方式;

                                ~]# grep -i "^s"  /proc/meminfo

                                ~]# grep "^[sS]" /proc/meminfo

                                ~]# grep -E "^(s|S)" /proc/meminfo 

                            2、顯示當前系統上root、centos或user1用戶的相關信息;

                                ~]# grep -E "^(root|centos|user1)\>" /etc/passwd

                            3、找出/etc/rc.d/init.d/functions文件中某單詞后面跟一個小括號的行;

                                ~]# grep -E "[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions

                            4、使用echo命令輸出一絕對路徑,使用egrep取出基名;

                                ~]# echo /etc/sysconfig/ | egrep -o "[^/]+/?$"

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

                            進一步:取出其路徑名;類似于對其執行dirname命令的結果;

                                ~]# echo /etc/sysconfig/network-scripts/ | egrep -o "^/.*(/[[:alnum:]])" | egrep -o "^/.*/" | egrep -o  "^.*[-[:alnum:]]"

                            5、找出ifconfig命令結果中的1-255之間的數值;

                                ~]# ifconfig | egrep -o "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"

                            6、課外作業:找出ifconfig命令結果中的ip地址;

                                ~]# ifconfig |egrep "(\<([0,1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0,1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\>"

                            7、添加用戶bash,testbash,basher以及nologin(其shell為/sbin/nologin);而后找出/etc/passwd文件中用戶名同shell名的行;

                                ~]# cat /etc/passwd | egrep "(\<[[:alnum:]]+\>).*\1$"

                                ~]# grep -E "^([^:]+\>).*\1$" /etc/passwd

     2.4、fgrep

                    fgrep:不支持正則表達式元字符;

                            當無需要用到元字符去編寫模式時,使用fgrep必能更好;


回目錄











原創文章,作者:Future,如若轉載,請注明出處:http://www.www58058.com/9671

(0)
FutureFuture
上一篇 2016-08-22 09:29
下一篇 2016-08-22 09:29

相關推薦

  • 設計模式(二)單件模式Singleton(創建型)

      幾乎所有面向對象的程序中,總有一些類的對象需要是唯一的,例如,通過數據庫句柄到數據庫的連接是獨占的。您希望在應用程序中共享數據庫句柄,因為在保持連接打開或關閉時,它是一種開銷。再如大家最經常用的IM,如QQ,在同一臺電腦,一個帳號只能有唯一的登錄。 1. 問題 怎樣確保一個特殊類的實例是獨一無二的(它是這個類的唯一實例),并且這個實例…

    Linux干貨 2015-06-24
  • Linux文件壓縮、解壓、歸檔總結

    一、簡介   壓縮對我們來說通常意味著減小文件體積,節省硬盤空間。在Windows平臺上處理大文件或目錄中的文件很多時我們都需要對這些文件進行壓縮處理,壓縮格式多種多樣,如:zip、rar、7z等格式,壓縮方式也比較多樣話,支持按最大壓縮比例或者最快時間進行壓縮等多種方式,而生成的壓縮包就可以讓我們更方便的進行拷貝及歸檔整理。解壓縮顧名思義就是回歸…

    Linux干貨 2015-09-26
  • 關于文本處理工具之SED

                                                      &nbsp…

    學員作品 2016-08-10
  • 一起學DHCP系列(四)安裝、配置

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://jeffyyko.blog.51cto.com/28563/162580       本節將主要講述DHCP的安裝和配置。     …

    Linux干貨 2015-03-25
  • ip命令詳解

      Linux中的ip命令功能強大,可以完成接口配置、路由管理等任務。   格式:ip [ OPTIONS ] OBJECT { COMMAND | help }   下面使用ip命令來完成一些常用的操作:     1、查看接口狀態       ip link show [設備名…

    Linux干貨 2016-01-14
  • Linux網站架構系列之Apache—-進階篇

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://nolinux.blog.51cto.com/4824967/1320167 本篇博文為Linux網站架構系列之apache的第二篇,我將帶大家一起學習apache的編譯參數,目錄結構和配置文件等方面的知識,實現對apac…

    Linux干貨 2016-08-15
欧美性久久久久