Linux grep 命令功能、正則表達式

一、grep簡介以及命令參數選項

二、正則表達式簡介及元字符、字符集合

三、grep及正則表達式實例

-------------------------------------------------------------------------------------------------------------------

grep 簡介


       grep : global search regular expression(RE)  and print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的擴展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正則表達式中的元字符表示回其自身的字面意義,不再特殊。linux使用GNU版本的grep。它功能更強,可以通過-G、-E、-F命令行選項來使用egrep和fgrep的功能。
       grep的工作方式是這樣的,它在一個或多個文件中搜索字符串模板。如果模板包括空格,則必須被引用,模板後的所有字符串被看作文件名。搜索的結果被送到屏幕,不影響原文件內容。
       grep可用於shell腳本,因爲grep通過返回一個狀態值來說明搜索的狀態,如果模板搜索成功,則返回0,如果搜索不成功,則返回1,如果搜索的文件不存在,則返回2。我們利用這些返回值就可進行一些自動化的文本處理工作。

grep 命令:

格式:grep [OPTIONS] PATTERN [FILE...]
         grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

【選項與參數】(這裏只介紹比較常用的選項,想了解更多請使用man grep查看)
--color=auto:高亮顯示匹配到的字符串;
-v --invert-match:反向選取,只顯示不符號模式的行
-o --only-matching:只顯示被模式匹配到的字串,而不是整個行;
-i --ignore-case:不區分字符大小寫
-l --files-with-matches:只列出匹配的文件名;
-L --files-without-matches:只列出不匹配的文件名;
-w --word-regexp:匹配完整字符串(單詞),而不是匹配部分字符串;
-A NUM:顯示匹配到的行,並顯示其後面的NUM行
-B NUM:顯示匹配到的行,並顯示其前面的NUM行
-C NUM:顯示匹配到的行,並顯示其前、後面的NUM行
-E --extended-regexp:支持擴展正則表達式

正則表達式簡介

       任何一個有經驗的系統管理員,都會告訴你:正則表達式真是挺重要的!爲什麼很重要呢?因爲日常生活就使用得到。舉個例子
來說,在你日常使用vim做文字處理或編寫程序時使用到的查找、替換等功能,這些舉動要做得漂亮,就得要配合正則表達式來處理!
       簡單的說,正則表達式就是處理字符串的方法,它是以行爲單位來進行字符串的處理行爲,正則表達式一般通過一些特殊符號的輔助,可以讓用戶輕易達到查找、刪除、替換某特定字符串的處理程序。正則表達式包括:基本正則表達式,擴展正則表達式;

基本正則表達式:貪婪模式(儘可能長地去匹配符合模式的內容)

元字符:
^:錨定行首的符合條件的內容,用法格式“^pattern”;
$:錨定行尾的符合條件的內容,用法格式“pattern$”;
.:匹配任意單個字符
*匹配緊挨在其前面的字符任意次
.*匹配任意長度的任意字符
[]匹配包含內的任一字單個字符
[^]匹配包含外的任一字單個字符
\將下一字符標記爲特殊字符、文本、反向引用或八進制轉義符
\?匹配緊挨在其前面的字符0次或1次;
\<錨定詞首
\>錨定詞尾
x\{m\}匹配其前面的字符“x”m次(精確匹配);
x\{m,\}匹配其前面的字符“x”至少m次;
x\{m,n\}匹配其前面的字符“x”至少m次,至多n次;
\(\):分組

字符集合:
[:lower:]:代表小寫字母,即 a-z
[:upper:]:代表大寫字母,即 A-Z
[:digit:]:代表數字,即 0-9
[:alpha:]:代表任何英文大小寫字母,即 a-z A-Z
[:alnum:]:代表英文大小字符及數字,即 0-9 a-z A-Z
[:space:]:代表空格鍵與Tab按
[:punct:]:代表標點符號,即 “  , ;? ! : # $


grep及正則表達式實例:

  通過以上對grep命令、正則表達式、元字符、字符集合的簡單介紹,下面我們來舉些例子,讓大家更好的瞭解grep命令及正則表達式的基本使用,並更好的瞭解命令的參數 、選項,正則表達式的元字符及字符集合的意義:

例一:在/etc/passwd文件中查找匹配root的串,並以高亮顯示其匹配的字符串。
[root@lgh01 ~]# grep --color=auto "root" /etc/passwd

171400925.png

--color=auto 可將正確匹配的字符串以高亮紅色顯示。


例二:在/etc/passwd文件中查找以root開頭的行,並將其顯示。

[root@lgh01 ~]# grep --color=auto "^root" /etc/passwd

171342328.png

通過行首錨定符進行匹配,可以看出此次匹配的內容僅是以root開頭的行。在其它位置出現不匹配。


例三:在/etc/passwd文件中查找以/bin/bash結尾的行,並將其顯示。
[root@lgh01 ~]# grep --color=auto "/bin/bash$" /etc/passwd

171309539.png

通過行尾錨定符進行匹配,可以看出此次匹配的內容僅是以/bin/bash結尾的行。


例四:在/etc/passwd文件中查找匹配ftp的行。
[root@lgh01 ~]# grep --color=auto ftp /etc/passwd

173237782.png

大家注意到沒有,此行還包含一個大寫“FTP”字符串,這裏沒有匹配出來,從這個例子中可以看出,grep命令進行字符匹配是區分大小寫字母的。


例五:在/etc/passwd文件中查找匹配ftp的行。不區分大小寫。

[root@lgh01 ~]# grep --color=auto -i ftp /etc/passwd

173743100.png

大家看看和上一個命令的區別,就很容易發現,通過-i參數,不區分大小寫進行匹配,所以大、小寫的ftp都匹配出來了。


例六:在/etc/passwd文件中查找匹配bin的字符串,要完全匹配,不能匹配類似sbin的字串。
[root@lgh01 ~]# grep --color=auto "\<bin\>" /etc/passwd

175649973.png

通過詞首"\<"、詞尾"\>"錨定符進行字符串完全匹配。如果不使用詞首詞尾錨定符,會將類似/sbin字串一起匹配出來。


例七:在/etc/passwd文件中查找匹配兩個ftp之間包含任意字符的行。
[root@lgh01 ~]# grep --color=auto "\(ftp\).*\1" /etc/passwd

181634975.png

ftp字符串以分組方式進行匹配,大家注意到命令中的\1,表示引用第一個分組的內容,如果字符串中有多個分組,可以用\2 \3進行引用第二分組及第三分組中的字符串。


例八:在/etc/passwd文件中查找匹配o,並且至少出現2次的字符串的行。
[root@lgh01 ~]# grep --color=auto 'o\{2,\}' /etc/passwd

201144883.png

\{2,\} 匹配前面字符至少2次,表示o字符最少必須連續出現兩次或三次或更多次,例:rooot 、spoooot、toooools等。


例九:顯示/etc/rc.d/rc.sysinit中以#開頭,且後面跟一個或多個空白字符,而後又跟了任意非空白字符的行。

[root@lgh01 ~]# grep '^#[[:space:]]\{1,\}[^[:space:]]*' /etc/rc.d/rc.sysinit

002943249.png

spacer.gif
例十:顯示/etc/rc.d/rc.sysinit文件中的內容,並不顯示以#號開頭的行和空白行。

[root@lgh01 ~]# grep -v '^#' /etc/rc.d/rc.sysinit | grep -v '^$'

003022106.png

spacer.gif
例十一:顯示IPV4的地址信息的行,排除lo迴環地址。
[root@lgh01 ~]# ip add list | egrep "[[:space:]]+inet[^6].*[^lo]$" 或
[root@lgh01 ~]# ifconfig | egrep "[[:space:]]+inet[^6].*" | grep -v 127.0.0.1

003107649.png

003107638.png

spacer.gif
例十二:找出ifconfig不包含迴環地址的其它IP地址,不包括IP廣播地址和子網掩碼等信息。

[root@lgh01 ~]# ifconfig |egrep --color "\<([1-9]|[1-9][0-9]|1[0-1]+[0-9]+|12[^7]+|1[3-9]+[0-9]|2[01][0-9]|22[0-3])\>(\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>){2}\.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>"

003140206.png

spacer.gif
這個看起來真是有些頭痛 ,不過多看幾遍就好了,我們分解一下在看看是不是就容易很多了。
"\<([1-9]|                         :1-9
[1-9][0-9]|                        :10-99
1[0-1]+[0-9]+|                 :100-199
12[^7]+|                           :120-129  排除127
1[3-9]+[0-9]|                    :130-139
2[01][0-9]|                        :200-219
22[0-3])\>    :220-223
(\.\<([0-9]|                       :0-9
[1-9][0-9]|                        :10-99
1[0-9][0-9]|                      :100-199
2[0-4][0-9]|                      :200-249
25[0-4])\>):250-254
{2}    精確匹配前面分組2次
\.\<([1-9]|                             :1-9
[1-9][0-9]|                            :10-99
1[0-9][0-9]|                          :100-199
2[0-4][0-9]|                          :200-249
25[0-4])\>"  :250-254


Linux grep 命令功能、正則表達式先簡單介紹到這裏了,希望對大家有所幫忙,本篇博文後續還會繼續更新,後續更新主要以實例爲主。希望大家關注啊!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章