grep命令
作用:文本搜索工具,根據用戶指定的“模式”對目標文本逐行進行匹配檢查;打印匹配到的行。
模式::由正則表達式字符及文本字符所編寫的過濾條件
語法:grep [OPTIONS] PATTERN [FILE...]
常用選項:
--color=auto #對匹配到的文本着色顯示 ,系統默認將grep別名設置為:grep='grep --color=auto'
-m # #只顯示匹配到的#行
-v #顯示不被pattern匹配到的行
-i #忽略字符大小寫
-n #顯示匹配的行號
-c #統計匹配的行數
-o #僅顯示匹配到的字符串
-q #靜默模式,不輸出任何信息
-A #顯示匹配到行的后幾行
-B #顯示匹配到行的前幾行
-C #顯示匹配到的行的前后幾行
-e #實現多個選項間的邏輯or關系
-w #匹配整個單詞
-E #使用ERE
-F #相當於fgrep,不支持正則表達式
-f #file 根據模式文件處理
正則表達式
REGEXP:由一類特殊字符及文本字符所編寫的模式, 其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能
分為兩大類,基本的正則表達式和擴展的正則表達式,二者元字符的區別如下:
1、基本正則表達式元字符
^ #如果在[]外則表示以某個字符開頭,如果在[]內,則表示除某些字符以外
$ #表示以某個字符結尾
. #表示匹配任意一個字符
* #表示匹配前面字符任意次
[] #表示匹配括號內的多個字符中的任意一個
.* #表示匹配所有
[^] #表示匹配除括號內以外的所有字符
^$ #表示匹配空行信息
\ #將含有特殊含義的字符轉義為原字符的含義
2、擴展的正則表達式
+ #表示前面字符出現一次或一次以上
? #表示前面字符出現0次或一次以上
| #表示或者的關系,匹配多個信息
() #匹配一個整體信息,可以進行后項引用
{} #定義前面的字符出現的次數
除此之外正則表達式也支持下面的元字符:
[:alnum:] 字母和數字
[:alpha:] 代表任何英文大小寫字符,亦即 A-Z, a-z
[:lower:] 小寫字母
[:upper:] 大寫字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范圍廣)
[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴...)
[:digit:] 十進制數字 [:xdigit:]十六進制數字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 標點符號
一、grep常用選項
舉例1:grep查找root關鍵字,且顯示匹配到的第一行

觀察以上三條命令的區別,不加-m選項,則默認顯示匹配到的所有的行,加了-m選項則只顯示-m指定的行數
舉例2:顯示文檔中除shenzhen以外的所有的行

通過以上結果可知,當加上-v選項后,shenzhen所在的那行不再被顯示
舉例3:不區分大小寫查找文檔中的shenzhen字符

當加上-i選項后,grep查找時,不區分關鍵字的大小寫
舉例4:查找shenzhen字符並顯示出字符在文檔中的行數

加上-n選項后,會在關鍵詞所在行的行首顯示出關鍵詞在文檔中的行數
舉例5:統計文檔中含有shenzhen字符的所有行的數量

加上-c選項后,會統計包含shenzhen字符的行數
舉例6:僅顯示匹配到的字符

加上-o選項不會顯示所匹配到的行,僅顯示匹配到的字符
舉例7:靜默顯示,即不輸出任何信息

在查詢root字符時,不會 輸出任何結果,但是會有執行結果
舉例8:顯示匹配到的行及其后面那一行

加上-A(after)選項,並指定行數為1,則顯示的結果為匹配到的行及其后面哪一行
舉例9:顯示匹配到的行及其前面哪一行

使用-B(before)選項,並指定行數為1,則顯示匹配到的行及其前一行
舉例10:顯示匹配到的行及其前后1行

使用-C選項並指明其行數為1,則顯示其匹配到的行以及前后各一行
舉例11:匹配多個選項

使用-e選項能實現匹配shenzhen或者longhua的字符的行,並顯示到屏幕
舉例12:精確匹配到某個單詞

不加-w選項,grep默認會顯示出所有包含字符的行,加上-w則表示顯示匹配到這個單詞的行
舉例13:通過擴展的正則匹配

由於?只支持擴展的正則表達式,所以需要在前面加上-E選項才能匹配到關鍵字符
二、grep位置錨定用法:
常用的表達式:
^ #行首錨定,用於模式的最左側
$ #行尾錨定,用於模式的最右側
^<pattern>$ #用於模式匹配整行
^$ #匹配空行
^[[:space:]]*$ #匹配空白行
\<或者\b #詞首錨定,用於單詞模式的最左側
\>或者\b #詞尾錨定,用於單詞模式的最右側
\<pattern\> #匹配整個單詞
舉例:查找/etc/passwd中以root開頭的行

在查找的字符前加^,只顯示以該字符開頭的行
舉例2:查找/etc/passwd中以nologin結尾的行

在要匹配的字符后面加$,則grep會查找出以該字符結尾的所有行
舉例3:查找出文檔內容中以大寫Z開頭,並以520結尾的行

舉例4:查找出文檔中的空行

^$以這兩個字符作為關鍵字符去匹配,意味着此行內沒有任何內容,即空行
舉例5:找出文檔中空白行

從上圖可知,^$匹配不了空白行,^[[:space:]]*$的含義為,以空白行開頭且中間有任意個空白字符的行
舉例6:查找文檔中re在詞尾的行

此處需要注意的是,用引號將模式給引起來,否則不生效
三、grep匹配次數
\{n\} #前面的字符重復n次
\{n,\} #前面的字符重復n次以上
\{m,n\} #前面的字符重復m次以上n次以下
舉例1:匹配字符r后面的o出現3次的行

注意觀察,標紅的字符為匹配到的字符,當連續出現3個o則被匹配
舉例2:匹配字符r后面的o出現最少3次,最多4次的行

觀察此圖和上圖的區別,可知上圖始終只能標識3個o,此圖中則標識3個和4個o
舉例3:匹配字符r后的o至少3次以上

舉例4:匹配字符r后面的o最多出現3次

上圖中,匹配o的次數包括0次,1次,2次,3次
四、分組及后向引用
\(\)將一個或多個字符捆綁在一起,當作一個整體處理,分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部變量中嗎,這些變量的命名方式為:\1,\2,\3……
舉例:利用grep分組匹配字符

以上將root和admin分別放在\(\)中,則將root分成組1,admin分成組2,后面再次出現重復字符時,可以通過\1和、2代替
五、或者
可以用符號\| 來表示匹配中的或者選項
舉例:過濾出文檔中Cat或者cat

在上圖中\|則表示的是邏輯中的或的意思
