大家在學習正則表達式之前,首先要明確一點,并把它牢牢記在心里,那就是:
在linux中,通配符是由shell解釋的,而正則表達式則是由命令解釋的,不要把二者搞混了。切記!!!
通常有三種文本處理工具/命令:grep、sed、awk,它們三者均可以解釋正則。下面我就為大家介紹grep命令的使用方法。
?
一、使用grep命令搜索文件中的內容
grep和egrep命令能夠在一個或多個文件的內容中搜索某一特定的字符模式,也被稱為正則表達式(regular expressions)。一個模式可以是一個單一的字符、一個字符串、一個單詞或一個句子。
一個正則表達式是描述一組字符串的一個模式。正則表達式的構成是模仿了數學表達式,通過使用操作符將較小的表達式組合成一個新的表達式。一個正則表達式既可以是一些純文本文字,也可以是用來產生模式的一些特殊字符。為了進一步定義一個搜索模式,grep命令支持以下幾種正則表達式的元字符,也稱通配符。
ps:正則表達式語言由兩種基本字符類型組成:原義(正常)文本字符和元字符。元字符使正則表達式具有處理能力。所謂元字符就是指那些在正則表達式中具有特殊意義的專用字符,可以用來規定其前導字符(即位于元字符前面的字符)在目標對象中的出現模式。
c*:將匹配0個或多個字符c
.:將匹配任何一個且只能是一個字符(換行符除外)
[xyz]:將匹配方括號中的任意一個字符
[^xyz]:將匹配不包括方括號中的字符的所有字符
^:鎖定行的開頭
$:鎖定行的結尾
在基本正則表達式中,如元字符*、+、{}、|、和()已經失去了它們原來的意義,如果要回復他們原本的含義要在之前冠以反斜線,如*、+等。
grep命令是用來在每一個文件中或標準輸出上搜索特定的模式。當使用grep命令時,包含一個指定字符模式的每一行都會被打印在屏幕上,grep命令的語法格式如下:
grep 選項 模式 文件名
其中,選項可以改變grep命令的搜索方式,除了-w選項外,其他的每個選項都可以在egrep和fgrep命令中使用。grep命令常用選項如下:
-c(count):僅列出包含模式的行數
-i(ignore):忽略模式中字母大小寫
-l(list):列出帶有匹配行的文件名
-n:在匹配行的前面列出行號
-v:列出沒有匹配模式的行(取反)
-w:把表達式當做一個完整的單字來搜索,忽略那些部分匹配的行
-q ?:靜默模式,沒有任何輸出,得用$?來判斷執行成功沒有,即有沒有過濾到想要的內容
-A n ?:如果匹配成功,則將匹配行及其后n行一起打印出來
-B n ?:如果匹配成功,則將匹配行及其前n行一起打印出來
-C n ?:如果匹配成功,則將匹配行及其前后n行一起打印出來
ps:如果搜索的是多個文件,grep命令的結果只顯示在文件中發現匹配模式的文件名;
? ? ? 如果搜索的是單個文件,grep命令的結果將顯示每一個包含匹配模式的行。
?
上面就是grep命令的基本使用方法。但是有時一個簡單的正則表達式無法定位你要搜索的內容,如要搜索同時滿足模式一和模式二的數據行,這時egrep命令就可以派上用場。
egrep命令的語法格式和grep命令相同。但是egrep命令是用來在一個或多個文件的內容中利用擴展的正則表達式的元字符搜索特定的模式。擴展的正則表達式的元字符包含了grep命令中使用的正則表達式元字符的同時,還增加了一些額外的元字符,大致有下面幾個:
+:匹配一個或多個前導字符
a|b:匹配a或b
(RE):匹配括號中的正則表達式RE
?
下面我將通過一些基本的例子來增進大家對grep和egrep命令用法的了解。鑒于grep命令中所有的選項egrep都能夠使用(egrep更加強大),為方便起見我將使用egrep命令為大家演示:
例一:顯示出文件/etc/passwd含有root的行
?
例二:輸出/etc/passwd中任何包含bash的所有行,還要輸出緊接著這行的上下各兩行的內容
?
例三:顯示出/etc/passwd中有多少行含有nologin
?
例四:顯示出/etc/passwd中那些行含有root,并將行號一塊輸出
?
例五:
新建用戶abominable、abominate、anomie、atomize,編寫正則表達式,將他們匹配出來
?
?
例六:新建用戶Alex213sb、Wpq2222b、yH438PIG、egon666、egon過濾出用戶名組成是字母+數字+字母的行
?
例七:顯示出/etc目錄下所有包含root的文件名
?
例八:過濾掉/etc/ssh/sshd_config內所有注釋和所有空行
?
以上例子只是很小的一部分,大家只要勤加練習,一定很快就能掌握grep命令的使用啦 ^^
?