1. 程式人生 > >2017-12-16Linux基礎知識(17)egrep擴展正則表達式

2017-12-16Linux基礎知識(17)egrep擴展正則表達式

linux 基礎


回顧一下上一章所講的內容,在上一章當中我們講述了文本處理工具grep命令,它是由用戶根據指定的"模式"來進行行匹配,默認為貪婪模式,講匹配到的結果進行打印到標準輸出中來,而正則表達式是由一群特殊的字符所編寫的,其中有一些字符並不代表原有的字面意義,而是用於控制或通配的功能,而正則表達式共分類兩類,一類是基本正則表達式,另一類是擴展正則表達式,二者區別就是它們的元字符有所不同,而元字符就是用來匹配和控制的功能,那麽在這一章當中我們講述egrep及擴展正則表達式命令。

一、egrep命令

除了我們之前講到的grep命令之外,還有egrep和fgrep命令,那麽grep現在都知道,是支持基本正則表達式,但使用

-E選項就能夠支持擴展正則表達式,egrep命令的特性為支持擴展正則表達式,但使用-G選項就能夠支持基本正則表達式,那麽fgrep則不支持基本正則表達式,也不支持擴展正則表達式,但使用以上那兩個選項就能支持正則表達式,同樣的,以上兩個無論是grep和egrep只要使用-F選項就和fgrep一樣不支持基本正則表達式和擴展的正則表達式。也就是說,這三個命令通過某些選項來調整其功能就能夠支持任何兩個命令的特性。
那麽egrep也就是支持擴展的正則表達式實現類似於grep文本過濾的功能,同時也可以使用grep -E也可以支持,那麽其命令格式也是和grep命令一樣:

   egrep [options] PATTERN [FILE...]

那麽支持的選項也是和grep一樣:

   -i, -o, -v, -A, -B, -C
   -G:支持基本正則表達式;

那麽接下來我們說一下擴展正則表達式的元字符,它的元字符和基本正則表達式的元字符有很多都是一樣的,只不過有些沒有了轉義符而已。

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

   次數匹配:
      *:任意次,0, 1或多次;
      ?:0次或1次,其前面的字符是可有可無的。
      +:其前面的字符至少一次;
      {m}:其前面的字符m次;
      {m,n}:至少m次,至多n次;
       {0,n}
       {m}
        
   位置錨定:
      ^:行首錨定;
      $:行尾錨定;
      \<, \b:詞首錨定;
      \>, \b:詞尾錨定;
    
   分組及引用:
      ():分組:括號內的模式匹配到字符會被記錄於正則表達式引擎的內部變量中;
      後向引用:\1, \2, ... (不能在bash中引用)

   或:
      a|b:a或者b
        C|cat:C或者cat;
        (C|c)at:Cat或者cat;

好的,以上就是擴展正則表達式的元字符,那麽現在練習以下習題:
1、找出/proc/meminfo中,所有在大寫或小寫開頭S的行;至少有三種實現方式;

   # grep ^[sS] /proc/meminfo 
   # grep -E "^(s|S)" /proc/meminfo
   # grep -i "^s" /proc/meminfo

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

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

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

   # grep -Eo "^[_[:alpha:]]*\(\)[[:space:]]*" /etc/rc.d/init.d/functions

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

   # echo "/etc/sysconfig" | grep -Eo "[^/]+?$"

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

   # ifconfig | grep -Eo "[1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4]"

那麽fgrep是不支持正則表達式元字符,當沒有需要用到元字符去編寫模式時,使用fgrep效果更佳;在生產環境中過濾日誌時性能會更好。

二、文本查看及處理工具

在這一次我們主要講以下幾個命令:

   wc, cut, sort, uniq, diff, patch

wc命令是一個單詞統計的命令,主要統計行數、單詞數和字節數,其命令格式為:

   wc [OPTIONS]... [FILE]...

該命令的選項為:

   -l:lines, 統計行數;
   -w:words, 統計單詞數;
   -c:bytes, 統計字節數;

cut命令是在文件的每一行中提取片段,在每個文件各個行中,把提取的片段顯示到標準輸出。其命令格式為:

   cut OPTIONS [FILE]...

該命令的選項為:

   -d CHAR:以指定的字符為分隔符;如果不指,默認為空白為分隔符;
   -f FILEDS:挑選出的字段;
      #:指定的多個字段;
      #-#:連續的多個字段;
      #,#:離散的多個字段;

sort命令是一個排序的命令,它是排序文本文件的行,其命令格式為:

   sort [OPTIONS]... [FILE]...

該命令的選項為:

   -n:基於數值大小而非字符進行排序;
   -t CHAR:指定分隔符;
   -k#:用於排序比較的字符;
   -r:逆序排序;
   -f:忽略字符大小寫;
   -u:重復的行只保留一份;
      重復行:連續且相同;

示例:

   # sort -t: -k3 -n -r /etc/passwd

uniq命令是一個報告或移除重復的行,和sort命令中的-u選項差不多,那麽其命令格式為:

   uniq [OPTIONS]... [INPUT [OUTPUT]]

該命令選項為:

   -c:顯示每行的重復次數;
   -u:僅顯示未曾重復過的行;
   -d:僅顯示重復過的行;

那麽diff命令是用來逐行匹配文件的不同之處,可以將其合並,給老文件進行打補丁,其命令格式為:

   diff [OPTIONS]... FILE

   diff /PATH/TO/OLDFILE /PATH/TO/NEWFILE > /PATH/TO/PATCH_FILE

patch就是向文件打補丁的命令,其命令格式為:

   patch [OPTIONS] -i /PATH/TO/PATH_FILE /PATH/TO/OLDFILE

   patch /PATH/TO/OLDDILE < /PATH/TO/PATCH_FILE


2017-12-16Linux基礎知識(17)egrep擴展正則表達式