管道命令grep、sed與正則表達式結合在一起讓你玩轉Linux?

這一節主要介紹正則表達式,以及Linux管道命令grep、sed結合正則表達式,毫不誇張的說,瞭解了這些用發以後,那麼在學習Linux路上相當於跨了一大步。

基礎正則表達式介紹grep結合正則表達式sed結合正則表達式基礎正則表達式介紹先介紹一些必要的符號[:alnum:] 代表英文大小寫字符及數字,亦即 0-9, A-Z, a-z

[:alpha:] 代表任何英文大小寫字符,亦即 A-Z, a-z

[:blank:] 代表空白鍵與 [Tab] 按鍵兩者

[:cntrl:] 代表鍵盤上面的控制按鍵,亦即包括 CR, LF, Tab, Del.. 等等

[:digit:] 代表數字而已,亦即 0-9

[:graph:] 除了空白字符 (空白鍵與 [Tab] 按鍵) 外的其他所有按鍵

[:lower:] 代表小寫字符,亦即 a-z

[:print:] 代表任何可以被打印出來的字符

[:punct:] 代表標點符號 (punctuation symbol),亦即:" ' ? ! ; : # $...

[:upper:] 代表大寫字符,亦即 A-Z

[:space:] 任何會產生空白的字符,包括空白鍵, [Tab], CR 等等

[:xdigit:] 代表 16 進位的數字類型,因此包括: 0-9, A-F, a-f 的數字與字符

尤其上表中的[:alnum:], [:alpha:], [:upper:], [:lower:], [:digit:] 這幾個一定要知道代表什麼意思,因為他要比 a-z 或 A-Z 的用途要確定的很!

一些常用的限定符* 匹配前面的子表達式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價於{0,}。

+ 匹配前面的子表達式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。

? 匹配前面的子表達式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等價於 {0,1}。

{n} n 是一個非負整數。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。

{n,} n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價於 'o+'。'o{0,}' 則等價於 'o*'。

{n,m} m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。

好了,下面就讓我們開始來玩玩進階版的 grep 吧!

正則表達式下的grep我們使用一個模板文件express.txt(借用鳥哥的文件)

管道命令grep、sed與正則表達式結合在一起讓你玩轉Linux?

express.txt模板練習文件

示例一 、在express.txt中搜索'the',反向搜做’the‘(搜索不包含'the'的行)。

管道命令grep、sed與正則表達式結合在一起讓你玩轉Linux?

搜索、反向搜索'the'

上圖第一個命令是搜索’the‘並且高亮顯示(高亮顯示是因為在alias中grep做了--color=auto別名),第二個命令是"反向"查找'the',即顯示出不含;'the'的行。

示例二、使用[]來搜索集合字符(常用)

管道命令grep、sed與正則表達式結合在一起讓你玩轉Linux?

[]集合字符用發

[ae]指的是字符'a'或'e'。

示例三、在express.txt中搜索'oo',以及不以'g'開頭的'oo'行

管道命令grep、sed與正則表達式結合在一起讓你玩轉Linux?

搜索'oo',以及不以'g'開頭的'oo'行

上圖中第二個命令[^g]意思是字符'g'的反向選擇(沒有[]的^是什麼還記的嗎?),也就是說'[^g]oo'意思是搜索包含'oo'但是不是'goo'。

下面出類似的題,大家試著想一下,

root@ubuntu:/tmp# grep -n '[^a-z]oo' express.txtroot@ubuntu:/tmp# grep -n '[0-9]' express.txtroot@ubuntu:/tmp# grep -n '[^[:lower:]]oo' express.txtroot@ubuntu:/tmp# grep -n '[[:digit:]]' express.txtroot@ubuntu:/tmp# grep -n '^the' express.txtroot@ubuntu:/tmp# grep -n '^[a-z]' express.txtroot@ubuntu:/tmp# grep -n '^[^a-zA-Z]' express.txtroot@ubuntu:/tmp# grep -n '\.$' express.txtroot@ubuntu:/tmp# grep -n '^$' express.txtroot@ubuntu:/tmp# grep -n 'g..d' express.txt(. 代表任意字符)root@ubuntu:/tmp# grep -n 'ooo*' express.txt (* 代表重複前一個字符, 0 到無窮多次”的意思,為組合形態)root@ubuntu:/tmp# grep -n 'o\{2\}' express.txt (限定連續 RE 字符範圍 {})root@ubuntu:/tmp# grep -n 'go\{2,5\}g' express.txtroot@ubuntu:/tmp# grep -n 'go\{2,\}g' express.txt大家可以試著想一下這些是什麼意思,可以在評論區回答一下,後續我會在評論區公佈答案。

正則表達式下的sedroot@ubuntu:/tmp# sed [-nefr] [動作]

sed選項與參數:

-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的數據一般都會被列出到屏幕上。

但如果加上 -n 參數後,則只有經過 sed 特殊處理的那一行(或者動作)才會被列出來。

-f :直接將 sed 的動作寫在一個文件內, -f filename 則可以執行 filename 內的 sed 動作;

-r :sed 的動作支持的是延伸型正則表達式的語法。(默認是基礎正則表達式語法)

-i :直接修改讀取的文件內容,而不是由屏幕輸出。

動作說明: [n1[,n2]]function

n1, n2 :不見得會存在,一般代表“選擇進行動作的行數”,舉例來說,如果我的動作

是需要在 10 到 20 行之間進行的,則“ 10,20[動作行為] ”

function 有下面這些咚咚:

a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~

c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!

d :刪除,因為是刪除啊,所以 d 後面通常不接任何咚咚;

i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);

p :打印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行~

s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正則表達式!

例如 1,20s/old/new/g 就是啦!

光說不練假把式,使用hosts文件作為練習文件

管道命令grep、sed與正則表達式結合在一起讓你玩轉Linux?

hosts模板練習文件

注意:sed後面接的動作必須是''單引號哦示例一、刪除2-5行 sed '2,5d'

管道命令grep、sed與正則表達式結合在一起讓你玩轉Linux?

刪除2-5行

示例二、在第二行添加‘this is my host’ sed '2a this is my host'

管道命令grep、sed與正則表達式結合在一起讓你玩轉Linux?

sed添加功能

示例三、取代2-5行,sed '2,5c replace2-5'

管道命令grep、sed與正則表達式結合在一起讓你玩轉Linux?

sed取代功能

示例四、替換 sed 's/#/$/g' hosts 把文件hosts中的字符'#'全部替換成'$'

管道命令grep、sed與正則表達式結合在一起讓你玩轉Linux?

sed替換功能

示例五、從ifconfig指令中截取ip地址(這個綜合性比較強,可以好好參考一下)

root@ubuntu:/tmp# ifconfig eth0 | grep 'inet '| sed 's/^.*inet addr://g'|sed 's/ .*//g'

管道命令grep、sed與正則表達式結合在一起讓你玩轉Linux?

ifconfig截取ip


分享到:


相關文章: