天天看點

好用的grep家族和正規表達式及練習題

grep指令是一種強大的文本搜尋工具,它能使用正規表達式搜尋文本,并把比對的行列印出來。grep全稱是Global Regular Expression Print,表示全局正規表達式版本,它的使用權限是所有使用者。

grep家族裡包括grep(使用基本正規表達式),egrep(可使用擴充正規表達式),fgrep(不支援使用正規表達式)

grep的用法為:

   grep [OPTION]... PATTERN [FILE]...

        常用選項:

        --color=auto:對比對到的文本着色後高亮顯示;

        -i:忽略字元大小寫;

        -o:僅顯示比對 到的文本自身;

        -v, --invert-match:反向比對;

        -E:支援擴充的正規表達式(相當于egrep);

        -q, --quiet, --silient:靜默模式,不輸出任何資訊;

例如:要查找/etc/passwd檔案中"root"就可以這樣寫: 

但是這樣凡是包含了root的字元都出來了,如果想要精确查找的話就要使用一個大殺器---正規表達式了。

正規表達式:使用單個字元串來描述、比對一系列符合某個句法規則的字元串。在很多文本編輯器裡,正規表達式通常被用來檢索、替換那些符合某個模式的文本。

那麼,最基本的正規表達式元字元有哪些呢?

字元比對:

     .:比對任意單個字元

好用的grep家族和正規表達式及練習題

    [ ]:比對範圍内的任意單個字元;

好用的grep家族和正規表達式及練習題

    [^ ]:比對範圍外的任意單個字元;

        表示在範圍内的反而不比對了,查找的都是不屬于該範圍的内容。

    [:digit:]等同與[0-9]:表示數字

    [:lower:]等同于[a-z]:表示小寫字母

    [:upper:]等同與[A-Z]:表示大寫字母

    [:alpha:]表示所有的字母(包括大寫和小寫)

    [:alnum:]:表示所有的數字和字母

    [:space:]:表示空格

    [:blank:]:空白和Tab鍵等

    [:punct:]:表示特殊字元 

好用的grep家族和正規表達式及練習題

次數比對:用在要指定其出現的次數的字元後面,用限制其前面的字元要出現的次數;預設工作于貪婪模式;

   *:比對前面的字元任意次(0,1或多次);                 

   .*:任意長度的任意字元;

好用的grep家族和正規表達式及練習題

   \+:比對前面的字元至少1次;

好用的grep家族和正規表達式及練習題

    \?:比對前面的0次或1次,即前面的字元可有可無;    

好用的grep家族和正規表達式及練習題

    \{m\}:其前面的字元出現m次,m為非負整數;                      

    \{m,n\}:其前面的字元出現m次,m為非負整數;[m,n]

       \{0,n\}:至多n次;

       \{m,\}:至少m次;

好用的grep家族和正規表達式及練習題

 位置錨定:限制使用模式搜尋文本,限制模式所比對到的文本隻能出現于目标文本的哪個位置;

   ^:行首錨定;用于模式的最左側,^PATTERN

好用的grep家族和正規表達式及練習題

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

好用的grep家族和正規表達式及練習題

   ^PATTERN$:要讓PATTERN完全比對一整行;

   ^$:空行;

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

好用的grep家族和正規表達式及練習題

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

   \<或\b:詞首錨定,用于單詞模式的左側,格式為\<PATTERN, \bPATTERN

好用的grep家族和正規表達式及練習題

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

好用的grep家族和正規表達式及練習題

   \<PATTERN\>:單詞錨定;

好用的grep家族和正規表達式及練習題

分組與引用:

    分組:

    \(PATTERN\)将此模式比對到的結果當作一個整體進行處理;并且比對到的結果會記錄于正規表達式内部變量中

    後向引用:引用前面的括号中的模式所比對到的結果。引用方式為\1,\2...

例如:顯示在文本中有l..e,并且後面有以此單詞加r的:

好用的grep家族和正規表達式及練習題

egrep:

    egrep與grep最大的不同是egrep支援擴充正規表達式,并且在寫法上也不需要加"\"來轉義。

擴充正規表達式的元字元:

    字元比對:

       .:任意單個字元

好用的grep家族和正規表達式及練習題

      [ ]:範圍内的任意單個字元

      [^ ]:範圍外的任意單個字元

好用的grep家族和正規表達式及練習題

比對次數:

       *:任意次;

       ?:0次或1次;

       +:1次或多次;

       {m}:比對m次;

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

       {0,n}

       {m,}

好用的grep家族和正規表達式及練習題

 位置錨定:

        ^:行首

        $:行尾

        \<, \b:詞首

        \>, \b:詞尾

比對以m開頭,e結尾的行

好用的grep家族和正規表達式及練習題

注意,詞首或詞尾錨定的時候還要”\”

好用的grep家族和正規表達式及練習題

    分組及引用:

        分組:(pattern),括号中的模式比對到的字元會被記錄于正規表達式引擎内部的變量中;

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

好用的grep家族和正規表達式及練習題

     或者:

       a|b:a或者b

       C|cat:表示C或cat

       (C|c)at:表示Cat或cat

好用的grep家族和正規表達式及練習題

綜合練習:

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

 2、找出/etc/passwd檔案中的三位或四位數;  

 3、找出/etc/grub2.cfg檔案中,以至少一個空白字元開頭,後面又跟了非空白字元的行;

4、找出"netstat  -tan”指令的結果中,以‘LISTEN’後跟0或多個空白字元結尾的行;   

 5、找出"fdisk  -l“指令的結果中,包含以/dev/後跟sd或hd及一個小字母的行;   

  6、找出”ldd  /usr/bin/cat“指令的結果裡檔案路徑;

 7、找出/proc/meminfo檔案中,所有以大寫或小寫s開頭的行;至少用三種方式實作;

  8、顯示目前系統上root、centos或slackware使用者的相關資訊;

   9、echo輸出一個絕對路徑,使用egrep取出其基名;                   

  10、找出ifconfig指令結果中的1-255之間的整數;

 11、添加使用者bash、testbash、basher及nologin,要求前三個使用者的預設shell為/bin/bash,nologin的預設shell為/sbin/nologin,而後找出其使用者名與shell名相同的使用者;

繼續閱讀