grep命令及正則表達式

grep命令和正則表達式


grep基本概念

grep:global search regular expression and print out the line.

作用:文本過濾器,用于文本搜索,用指定“模式”逐行匹配。

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

正則表達式:由一類特殊字符和文本字符所編寫的模式,其有些字符不表示字符字面意義,而表示控制或通配的功能

比較記憶:

無標題22.png

基本正則表達式:BRE
擴展正則表達式:ERE
    grep -E = egrep

grep語法

grep [OPTIONS] PATTERN [FILE…]

OPTIONS:
            --color=auto:對匹配到的文本著色后高亮顯示;
            -i:ignorecase,忽略字符的大小寫;
            -o:僅顯示匹配到的字符串本身;
            -v, --invert-match:顯示不能被模式匹配到的行;
            -E:支持使用擴展的正則表達式元字符;
            -q, --quiet, --silent:靜默模式,即不輸出任何信息;

            -A #:after, 后#行
            -B #:before,前#行
            -C #:context,前后各#行

基本正則表達式原字符

字符匹配:

    . :匹配任意單個字符;
    []:匹配指定范圍內的任意單個字符;
    [^]:匹配指定范圍外的任意單個字符;
    [:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]

匹配次數:

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

*:匹配其前面的字符任意次;0,1,多次;
        例如:grep "x\+y"
                abxy
                aby
                xxxxxy
                yab
.*:匹配任意長度的任意字符
\?:匹配其前面的字符0次或1次;即其前面的字符是可有可無的;
\+:匹配其前面的字符1次或多次;即其面的字符要出現至少1次;
\{m\}:匹配其前面的字符m次;
\{m,n\}:匹配其前面的字符至少m次,至多n次;
\{0,n\}:至多n次
\{m,\}:至少m次

位置錨定:

^:行首錨定;用于模式的最左側;
$:行尾錨定;用于模式的最右側;
^PATTERN$:用于PATTERN來匹配整行;
^$:空白行;
^[[:space:]]*$:空行或包含空白字符的行;



\< 或 \b:詞首錨定,用于單詞模式的左側;
\> 或 \b:詞尾錨定,用于單詞模式的右側;
\<PATTERN\>:匹配完整單詞;
單詞:非特殊字符組成的連續字符(字符串)都稱為單詞;

分組及引用

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

Note:分組括號中的模式匹配 到的內容會被正則表達式引擎自動記錄于內部的變量中,這些變量為:
\1:模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符;
\2:模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字符;
\3
      ...

            He loves his lover.
            He likes his lover.
            She likes her liker.
            She loves her liker.

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

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

擴展正則表達式的元字符

字符匹配:

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

次數匹配:

*:任意次,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

練習:(grep)

1、顯示/etc/passwd文件中不以/bin/bash結尾的行;
    ~]# grep -v "/bin/bash$" /etc/passwd

2、找出/etc/passwd文件中的兩位數或三位數;
    ~]# grep  "\<[0-9]\{2,3\}\>"  /etc/passwd

3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一個空白字符開頭,且后面非空白字符的行;
    ~]# grep  "^[[:space:]]\+[^[:space:]]"  /etc/grub2.cfg

4、找出"netstat -tan"命令的結果中以'LISTEN'后跟0、1或多個空白字符結尾的行;
    ~]# netstat -tan | grep  "LISTEN[[:space:]]*$"

練習:(egrep)

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  -o  "[_[:alnum:]]+\(\)"  /etc/rc.d/init.d/functions

4、使用echo命令輸出一絕對路徑,使用egrep取出基名;
    ~]# echo /etc/sysconfig/ | grep  -E  -o  "[^/]+/?$"

    進一步:取出其路徑名;類似于對其執行dirname命令的結果;
        ~]# echo /etc/sysconfig/ | egrep -o "^/.*[^/]" | egrep -o "^/.*/" | egrep -o  "^.*[^/]"
        ~]#echo /etc/sysconfig/ | egrep -o "^/.*(/[[:alnum:]])" | egrep -o "^/.*/" | egrep -o  "^.*[^/]"
5、找出ifconfig命令結果中的1-255之間的數值;
    ~]# ifconfig | grep  -E  -o  "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"

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

7、添加用戶bash, testbash, basher以及nologin(其shell為/sbin/nologin);而后找出/etc/passwd文件中用戶名同shell名的行;
    ~]# grep  -E  "^([^:]+\>).*\1$"  /etc/passwd

課外練習

http://www.tuicool.com/articles/uyuIbaV

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

(0)
N24_yeziN24_yezi
上一篇 2016-11-05
下一篇 2016-11-05

相關推薦

  • 循環語句

    馮羅伊曼體系架構 1.?輸入設備 2.?輸出設備 3.?存儲器 4.?運算器 5.?控制器 轉義序列:\\, \t , \r , \n , \”, ?\’ Python:是動態語言,強類型語言 算數運算符 + – */ % ** /是自然除,//是整除 位運算符 & | ?~ ?^ ?<< ?>> 原碼 5=&gt…

    Linux干貨 2018-03-26
  • Linux基礎知識之history命令詳解

     該博文以CentOS6.8_x86_64系統為基礎,Xshell 5遠程連接CentOS系統,以root身份登錄系統。 為什么要學習history命令?     history命令是Linux的一個內嵌的shell命令,history命令的使用有時會大大縮短我們輸入命令的時間,達到節省命令快捷操作的要求。學…

    Linux干貨 2016-07-27
  • TCP/IP五層模型

    1、簡述osi七層模型和TCP/IP五層模型 網絡的七層模型是由OSI和CITT一起制定的開放系統互連參考模型: TCP/IP 五層模型可以分為:應用層,傳輸層,網絡層,數據鏈路層,物理層。 2、簡述ip route家族命令 語法:ip [ OPTIONS ] OBJECT { COMMAND | help } OBJECT={link ,addr,rout…

    2018-01-05
  • bash特性

    2018-03-11

    2018-03-11
  • php 設計模式-數據映射模式(應用程序與數據庫交互模式)

    前面提到的設計模式大大提高了代碼的可讀性與可維護性。然而,在WEB應用設計與開發中一個基本的需求與挑戰:數據庫應用,這些設計模式都沒有涉及到。數據映射模式使您能更好的組織你的應用程序與數據庫進行交互。 下面我將用實際代碼說明,如果一個表發生變動。我們要修改客戶端代碼就可以了。特別是游戲項目,需求經??赡軙洺W儎印P薷谋斫Y構,可能引起大片代碼的改動。 首先我…

    Linux干貨 2015-04-07

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-11-10 18:36

    贊,grep總結的還是比較細的,幾個例子也比較好~繼續加油~

欧美性久久久久