1.什么是grep
grep(Golobal Regular Expression print)是Linux系統中一個強大的文本搜索工具,也是俗稱的搜索三兄弟之一,grep的最大意義就是搜索文本,把匹配的行打印到屏幕上,但不影響原文件的內容;在搜索文本的過程中,可以利用到“正則表達式”來定以自己的搜索匹配模式。
Unix的grep家族包括了grep、egrep、fgrep三個,接下來的內容也會圍繞著grep來進行展開;
2.grep家族的簡單用法
2.1常用用法
grep的常用用法很簡單,通常使用如下的格式:
grep [OPTIONS] PATTERN [FILES];
PATTERN也就是搜索模式,是grep進行文本搜索過濾的條件,通常由正常字符及正則表達式的字符組成;
相對于grep而言,egrep = grep -E 可以使用基本的正則表達外, 還可以用擴展表達式;fgrep=grep –F, 但是fgrep與grep及egrep有一些明顯的區別,fgrep并不使用正則表達式,而會將PATTERN解釋為一般的字符來進行查找,從而fgrep在搜索不需要使用正則表達式的情況下速度是最快的;
2.2常見參數
Options |
解釋 |
-o |
只顯示被模式匹配到的內容 |
-i |
搜索時不區分字符大小寫 |
-v |
顯示不能夠被模式匹配到的行 |
-E |
使用擴展的正則表達式,相當于使用egrep |
-F |
將范本樣式視為固定字符串的列表,相當于fgrep |
-c |
只顯示匹配行的數量 |
-n |
在輸出前加上上匹配行的行號 |
–color= |
auto, always, never |
-A # |
顯示被模式匹配到的行及后#行 |
-B # |
顯示被模式匹配到的行及前#行 |
-c # |
顯示被模式匹配到的行及其前后各#行 |
3.詳解grep的搜索
3.1通配符
在搞搞grep的搜索用法,也就是使用正則表達式之前,我覺得自己還是很有必要來重新過一遍Linux中shell的通配符,來作為學習正則表達式之前的熱身和比較;目前最常用的文件通配符包括*、?、[],具體如下:
解釋 |
示例 |
|
* |
任意長度的任意字符,零個或多個; |
heah*,以head為首的任意長度的字符 *tail,以tail為結尾的任意長度的字符 |
? |
任意單個字符,可使用多次 |
y?u,?表示中間有且只亦一個字符 |
[] |
匹配[]內任意單個字符 |
[0-9][abd] |
[^] |
不匹配[]內的任何字符 |
[^0-9]匹配0-9之外的任意字符 |
注:這些字符都有這特殊含義,而要想使用其的一般含義,需加上轉義符”\”進行轉義;
3.2正則表達式
想想還是覺得c一段正則的解釋放在這里比較好,不然我自己都說不出個所以然來。正則表達式(REGular Expression);簡稱REGEXP,是由元字符及正常字符所書寫的模式,其中有元字符不表示字符本身的意義,而是用于表達控制或通配等功能;而常用的正則表達式則分為了基礎正則表達式、擴展正則表達式,為了方便自己記憶,還是覺得整個丑的表格比較下:
偷懶這里就按照馬哥教的來排個序;基礎和正則表達式最大的區別也就是在使用上,例如grep –E或者egrep才可以使用擴展正則表達式,以后在使用的過程中,也必須要了解命令是否支持擴展的正則表達式先;
類型 |
元字符 |
意義 |
|
基礎篇 |
擴展篇 |
||
字符匹配 |
. |
. |
匹配任意單個字符,相當于通配符?; |
[] |
[] |
匹配指定范圍內的任意單個字符; |
|
[^] |
[^] |
匹配指定范圍外的任意單個字符; |
|
一些常用特殊的字符匹配,通用 |
|||
[0-9] = [[:digit:]] = \d = [123456789] |
匹配數字 |
||
[a-z] = [[:lower:]] |
匹配單個小寫字母 |
||
[A-Z] = [[:upper:]] |
匹配單個大寫字母 |
||
[0-9a-zA-Z] = [[:alnum:]] |
匹配單子字母或數字 |
||
[a-zA-Z] = [[:alpha:]] |
匹配單個字母,不區分大小寫 |
||
[[:space:]] = \s |
匹配空白字符 |
||
[[:punct:]] |
匹配單個標點符號 |
||
\w |
匹配字母或數字或下劃線或漢字 |
||
注:可使用[^]表示范圍外,[^[]] |
類型 |
元字符 |
意義 |
|
基礎篇 |
擴展篇 |
||
次數匹配 (在期望匹配字符的后面提供一個控制符號,用于表達匹配前面的字符指定的次數) |
* |
* |
匹配*前面的單個字符任意次,可以為0次; |
.* |
.* |
匹配任意長度的任意字符; |
|
\? |
? |
匹配?前面的字符0或者1次; |
|
\+ |
+ |
匹配+前面的字符至少1次; |
|
\{m,n\} |
{m,n} |
匹配其左側的字符至少m次,至多n次; |
|
\{m,\} |
{m,} |
匹配其左側的字符至少m次,無上限; |
|
\{0,n\} |
{0,n} |
匹配其左側的字符至多n次; |
|
\{m\} |
{m} |
精確匹配其左側的字符m次; |
|
類型 |
元字符 |
意義 |
|
基礎篇 |
擴展篇 |
||
位置錨定 |
^ |
^ |
錨定行首,^PATTERN; |
$ |
$ |
錨定行尾,PATTERN$; |
|
^PATTERN$ |
^PATTERN$ |
用模式匹配整行內容; |
|
^$ |
^$ |
^[[:space:]]$,匹配空白行; |
|
類型 |
元字符 |
意義 |
|
基礎篇 |
擴展篇 |
||
單詞錨定 |
\< |
\< |
錨定詞首,\<PATTERN = \bPATTERN; |
\> |
\> |
錨定詞尾, PATTERN\> = PATTERN\b |
|
\<PATTERN\> |
\<PATTERN\> |
匹配PATTERN能匹配到的整個單詞; |
|
\b |
\b |
匹配一個字邊界,即字與空格間的位置; |
|
類型 |
元字符 |
意義 |
|
基礎篇 |
擴展篇 |
||
分組及引用 |
\(\) |
() |
將()中字符集合到一起作為一個字符引用; |
\# |
\# |
引用,模式中自左而右, |
|
分組中的模式,在某次的具體匹配過程中所匹配的字符,可以被grep記憶(保存在內置的變量中,這些變量是\1, \2,…),因此,還可以被引用; |
還是要注:這些字符都有這特殊含義,而要想使用其的一般含義,需加上轉義符”\”進行轉義;
摘一段正則表達式的貪婪與非貪婪模式:
1.什么是正則表達式的貪婪與非貪婪匹配
如:String str="abcaxc";
Patter p="ab*c";
貪婪匹配:正則表達式一般趨向于最大長度匹配,也就是所謂的貪婪匹配。如上面使用模式p匹配字符串str,結果就是匹配到:abcaxc(ab*c)。
非貪婪匹配:就是匹配到結果就好,就少的匹配字符。如上面使用模式p匹配字符串str,結果就是匹配到:abc(ab*c)。
默認是貪婪模式;在量詞后面直接加上一個問號?就是非貪婪模式。
正則表達式還有很多,鑒于我初學的能力,慢慢來總結,記錄下幾個例子來幫自己回顧下:
1、找出/etc/passwd文件中的一位數或兩位數:
2、找出當前系統上用戶名與默認shell相同的用戶:
[root@Exercises ~]# grep "^\(\<[[:alnum:]]\+\>\).*\1$" /etc/passwd
3、使用echo命令輸出一個路徑,使用grep實現basename的功能:
[root@Exercises ~]# echo "/etc/passwd/" |grep -o "[[:alnum:]]\+\/\?$" |cut -d/ -f1
passwd
4、執行ifconfig然后輸出當前系統的ip:
[root@Exercises ~]# ifconfig | grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-3][0-9])\>(\.\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>){3}"
inet addr:192.168.1.111 Bcast:192.168.1.255 Mask:255.255.255.0
inet addr:192.168.88.20 Bcast:192.168.88.255 Mask:255.255.255.0
第一篇,很不完善,還是要繼續總結,還是要堅持~
同時,求指正,求指正!謝謝~
原創文章,作者:AZ,如若轉載,請注明出處:http://www.www58058.com/8686