Linux之正規表示式

2020-10-17 15:00:59

什麼是正規表示式?

簡單地說,正規表示式就是處理字串的方法,它以行為單位來進行字串的處理操作,正規表示式通過一些特殊符號的輔助,可以讓使用者輕易地完成【查詢、刪除、替換】某特定字串的處理過程。

正規表示式基本上是一種**【表示法】**,只要程式支援這種表示法,那麼該程式就可以用來作為正規表示式的字串處理。

正規表示式的字串表示方式依照不同的嚴謹度分為:基礎正規表示式、擴充套件正規表示式。

用途:郵件伺服器

注意:正規表示式與萬用字元是完全不一樣的東西,因為【萬用字元代表的是bash操作介面的一個功能】,但是正規表示式則是一種字串處理的方式。使用正規表示式的時候,需要特別注意當時環境的語系,否則可能會發現選取的結果不合人意。

一、基礎正規表示式

1、符號的含義
「 [:alnum:] 」代表英文大小寫字元及數位,亦即 0 ~ 9、A ~ Z、a ~ z
「 [:alpha:] 」代表任何英文大小寫字元,亦即 A ~ Z、a ~ z
「 [:blank:] 」代表空格鍵與[Tab]鍵
「 [:cntrl:] 」代表鍵盤上面 控制鍵,包括CR、LF、Tab、Del
「 [:digit:] 」代表數位,亦即 0 ~ 9
「 [:graph:] 」代表空格符以外的所有按鍵
「 [:lower:] 」代表英文小寫字元,亦即 a ~ z
「 [:print:] 」代表任何可以被列印出來的字元
「 [:punct:] 」代表標點字元,亦即 " ’ ? ! ; : # $
「 [:upper:] 」代表英文大寫字元,亦即 A ~ Z
「 [:space:] 」代表任何會產生的空白的字元,包括空格、Tab鍵、CR等
「 [:xdigit:] 」代表十六進位制的數位型別

案例一:檢視a.txt檔案中所有含有數位的行
語法:cat a.txt | grep '[[:digit:]]'
在這裡插入圖片描述
2、行首字元 ’ ^ ’ 與行為字元 ’ $ ',「 ^ 」在字元集合符號([ ])中是表示反向,在外面表示定位在行首的意思
案例二:列出 /bin 目錄下所
有以d開頭的檔案
在這裡插入圖片描述
3、任意一個字元
「 . 」表示【一定有一個任意字元】
「 * 」表示【重複前一個字元0次或N次】

注意:【.*代表零個或者多個任意字元】

案例三:獲取 /bin 目錄下以a開頭h結尾且位數為四位的目錄
語法:ls /bin | grep '^a…h$'
在這裡插入圖片描述
案例四:獲取 /bin 目錄下最少含有兩個連續ee的目錄
語法:ls /bin | grep ‘eee*’
在這裡插入圖片描述
4、限定連續RE字元範圍{}
如果想要限制次數獲取的範圍,可以使用{},但是因為 { 和 } 在shell中是有特殊意義的,所有需要跳脫符 \ 來使它們有意義

案例五:獲取 /bin 目錄下含有四個字元的目錄
語法:ls | grep '^.{4} $'
在這裡插入圖片描述
5、sed工具(重點)
當我們分析紀錄檔檔案的時候,絕大部分需要分析關鍵詞的使用、統計等,可以使用sed工具來實現。sed本身也是一個管道命令,可以分析標準輸入。而且sed還可以將資料進行替換、刪除、新增、選取特定行等功能。

語法:sed [-nefr] [操作]
「 -n 」表示只有經過sed特殊處理的那一行才會被列出
「 -e 」表示直接在命令列模式上進行sed的操作編輯
「 -f 」表示直接將sed的操作解除安裝一個檔案內
「 -r 」表示使用擴充套件性正規表示式(預設是基礎正規表示式)
操作說明: [n1,n2] function
「 n1,n2 表示行號 」
「 a 」表示新增,後面可以接字元,這些字元會顯示在新的一行
「 c 」表示替換,後面接字元,這些字元會替換n1,n2之間的行
「 d 」表示刪除
「 i 」表示插入,後面接字元,這些字元會在新的一行出現
「 p 」表示列印
「 s 」表示可以直接進行替換操作

案例六:列出a.txt檔案並列印行號,同時刪除2-5行的內容
在這裡插入圖片描述如果需要刪除第3行開始到最後一行,可以使用 nl a.txt | sed '3, d ′ , d', d 表示最後一行

案例七:替換a.txt檔案中第一行的內容為Hello World
語法:nl a.txt | sed '1c Hello World’

在這裡插入圖片描述
部分資料的查詢並替換的功能(重點):
語法:sed 's/要被替換的字元/新的字元/g’

案例八:獲取 /etc/man_db.conf 中MAN存在的幾條資料,但是含義#在內的註釋不
要,而且空白行不要
語法:*cat /etc/man_db.conf | grep ‘MAN’ | sed '/#.s//g’ | sed ‘/^$/d’

二、擴充套件正規表示式

符號含義
「 + 」表示重複【一個或一個以上】的前一個RE字元
「 ? 」表示【零個或一個】前一個RE字元
「 | 」表示【或(or)的方式找出字串】
「 () 」表示找出【群組】字串

「 ()+ 」表示多個重複群組的判別

三、檔案的格式化與相關處理

1、格式化列印
語法:printf ‘列印內容’ 實際內容
特殊格式:
「 \a 」表示警告聲音輸出
「 \b 」表示退格鍵
「 \f 」表示清除螢幕
「 \n 」表示輸出新的一行
「 \r 」表示回車按鍵
「 \t 」表示水平的tab鍵
「 \v 」表示垂直的tab鍵
「 \xNN 」表示NN為兩位數,可以轉換數位成字元

2、資料處理工具:awk
sed常常用於一整行的處理,awk更傾向於一行當中分成數個欄位來處理。awk主要處理每一行的欄位內的資料(欄位為最小的處理單位),而預設的欄位的分隔符為空格鍵或者Tab鍵。
語法:awk ‘條件型別1{操作1} 條件型別2{操作2}’

案例九:列出最後5位登入使用者並列印出第一個、第三個欄位
語法:last -n 5 | awk ‘{print $1 「\t」 $3}’

在這裡插入圖片描述

四、檔案比對工具

1、比對兩個檔案之間的差距
語法:diff [-bBi] 檔案1 檔案2
「 -b 」表示忽略一行當中,僅有多個空白的差異
「 -B 」忽略空白行的差異
「 -i 」忽略大小寫
在這裡插入圖片描述「 12,14d11 」表示左邊第12,14行被刪除(d)掉了,基準是右邊的第11行
「 < 」表示左邊的內容
「 > 」表示右邊的內容

2、cmp(主要用於對比檔案,主要利用位元組單位對比,也可以對比二進位制檔案
語法:cmp 檔案1 檔案2
在這裡插入圖片描述