一、文本搜索工具中的grep和egrep
grep (global search regular expression_r(RE) and print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的擴展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正則表達式中的元字符表示回其自身的字面意義,不再特殊。
二、grep的工作方式
grep在一個或多個文件中搜索字符串模板。如果模板包括空格,則必須被引用,模板後的所有字符串被看作文件名。搜索的結果被送到屏幕,不影響原文件內容。
grep可用於shell腳本,因爲grep通過返回一個狀態值來說明搜索的狀態,如果模板搜索成功,則返回0,如果搜索不成功,則返回1-255中一個數值。我們利用這些返回值就可進行一些自動化的文本處理工作。
三、正則表達式
正則表達式又稱正規表達法、常規表示法(英語:Regular Expression,在代碼中常簡寫爲regex、regexp或RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器裏,正則表達式通常被用來檢索、替換那些符合某個模式的文本。
正則表達式分兩類:
1、基本正則表達式 BRE
2、擴展正則表達式 ERE
正則表達式引擎:利用正則表達式模式分析給定文本的程序。
四、grep家族
grep: (Global search REgular expression and Print out the line.) 支持使用基本正則表達式;
egrep:支持使用擴展正則表達式;
fgrep:不支持使用正則表達式;
五、grep命令
grep的主要功能用於檢索文件內容,字符串等的工具。可以根據用戶指定的“模式(pattern)”對目標文本進行搜索過濾,顯示出被“模式pattern”匹配到的行。
注意:CentOS 7中alias中有grep='grep--color=auto',CentOS 6中沒有,需要手動添加,然後搜索的內容高亮顯示。
其基本語法是:
grep [OPTIONS] PATTERN [FILE...]
PATTERN:是文本字符和正則表達式的元字符組合而成的匹配條件,可用單引號‘ ’將pattern括起來以避免shell通配的影響,強引用不替換而顯示字符本身。" " 雙引號,字符串中的` ` ,$, \ 等特殊字符會被shell解釋替換後,再傳遞給grep。對普通的字符串(沒有特殊字符和空格的字符串)也可以不加引號,直接搜索。
OPTIONS:(這裏給出常用的選項) 以CentOS 7爲例介紹
-i 忽略大小寫
-c 顯示被匹配到的行數
-n 輸出行號
-v 反向選擇,即找沒有搜索字符串的行
-o 僅顯示匹配到的內容
-w 匹配單詞
-A # 連同匹配行的下#行一併顯示,#代表任意數字
-B # 連同匹配行的上#行一併顯示,#代表任意數字
-C # 連同匹配行的上下#行一併顯示,#代表任意數字
-R或-r 遞歸搜索目錄或子目錄下匹配的字所在文件(可配合find命令
-E 相當於egrep 支持擴展的正則表達式
-F 相當於fgrep 不支持正則表達式
--color對匹配的內容以顏色顯示
-e PATTERN, --regexp=PATTERN:多模式機制;
-f FILE, --file=FILE:FILE爲每行包含了一個pattern的文本文件,即grep script;
案例:寫一個nano腳本,命令爲mybit,內容爲 r..t,
-V 顯示grep版本
-L:輸出時只顯示不包含匹配項的文件名,通常與-r選項連用來查找帶指定內容的文件。
-l:輸出時只顯示包含匹配項的文件名。
六、grep基本正則表達式的元字符集
注意:可直接按要求匹配,也可以通過管道的方式表達
1、字符匹配
.:匹配任意單個字符;
[ ]:匹配範圍內的任意單個字符;
[^ ]:匹配範圍外的任意單個字符;
[[:digit:]]:任意數字
[[:lower:]]:任意小寫字母
[[:upper:]]:任意大寫字母
[[:alpha:]]:任意字母
[[:alnum:]]:任意字母和數字
[[:space:]]:空白字符
[[:blank:]]:空格和Tab鍵
[[:punct:]]:任意標點符號
2、次數匹配:限制字符出現的次數;默認工作於貪婪模式
*:匹配前面的字符任意次(0,1或多次)
.*:任意長度的任意字符
\+:匹配前面的字符至少1次;
案例:grep "m\+y" 匹配y前面至少出現一個m的行
mmxyabc 可以
yabc 不可以
abcmy 可以
abcy 不可以
\?:匹配前面的0次或1次,即前面的字符可有可無;
案例:grep "q\?z" 匹配字符z前面出現了一個q或者沒有q的行
xqxzabc 可以
zabc 可以
abcq 不可以
abcz 可以
\{m\}:其前面的字符出現m次,m爲非負整數;
案例:grep "x\{2\}y":
xxxyabc 可以
yabc 不可以
abcxy 不可以
abcy 不可以
\{m,n\}:其前面的字符出現至少m次,至多n次;即[m,n]
\{0,n\}:至多n次;
\{m,\}:至少m次;
3、位置錨定:限制使用模式搜索文本,限制模式所匹配到的文本只能出現於目標文本的哪個位置;
^:行首錨定;用於模式的最左側,^PATTERN
$:行尾錨定;用於模式的最右側,PATTERN$
^PATTERN$:要讓PATTERN完全匹配一整行;
^$:空行;
^[[:space:]]*$:空行或空白行
單詞:由非特殊字符組成的連續字符(字符串)都稱爲單詞;
\<或\b:詞首錨定,用於單詞模式的左側,格式爲\<PATTERN, \bPATTERN
\>或\b:詞尾錨定,用於單詞模式的右側,格式爲PATTERN\>, PATTERN\b
\<PATTERN\>:單詞錨定;
4、分組與引用:
\(PATTERN\):將此PATTERN匹配到的字符當作一個不可侵害整體進行處理;
Note:分組括號中的模式匹配到的字符會被正則表達式引擎自動記錄於內部的變量中,這些變量是\1, \2, \3, ...
pat1\(pat2\)pat3\(pat4\(pat5\)pat6\)
\n:模式中第n個左括號以及與之匹配的右括號之間的模式所匹配到的字符串;(不是模式,而是模式匹配的結果)
\1:第一組括號中的pattern匹配到的字符串;
\2:第二組括號中的pattern匹配到的字符串;
後向引用:引用前面的括號中的模式所匹配到的字符串;
案例:寫一個nano腳本,命名爲grep.txt,內容如下:
He love his lover.
He like his lover.
He love his liker.
He like his liker.
七、egrep擴展正則表達式的元字符集 相當於grep -E。
egrep [OPTIONS] PATTERN [FILE...]
1、字符匹配
.:任意單個字符
[ ]:範圍內的任意單個字符
[^ ]:範圍外的任意單個字符
2、次數匹配:限制字符出現的次數;默認工作於貪婪模式,同前面的grep用法相似,只是不再需要添加轉義字符\
*:任意次;
?:0次或1次;
案例:grep "q?z" 匹配字符z前面出現了一個q或者沒有q的行
xqxzabc 可以
zabc 可以
abcq 不可以
abcz 可以
+:1次或多次;
案例:grep "m+y" 匹配y前面至少出現一個m的行
mmxyabc 可以
yabc 不可以
abcmy 可以
abcy 不可以
{m}:匹配m次;
案例:grep "x{2}y"
xxxyabc 可以
yabc 不可以
abcxy 不可以
abcy 不可以
{m,n}:至少m次,至多n次;
{0,n}
{m,}
3、位置錨定:限制使用模式搜索文本,限制模式所匹配到的文本只能出現於目標文本的哪個位置;
^:行首錨定;用於模式的最左側,^PATTERN
$:行尾錨定;用於模式的最右側,PATTERN$
\<, \b:詞首
\>, \b:詞尾
4、分組與引用:用法同grep一樣。
\(PATTERN\):將此PATTERN匹配到的字符當作一個不可侵害整體進行處理;
Note:分組括號中的模式匹配到的字符會被正則表達式引擎自動記錄於內部的變量中,這些變量是\1, \2, \3, ...
pat1\(pat2\)pat3\(pat4\(pat5\)pat6\)
\n:模式中第n個左括號以及與之匹配的右括號之間的模式所匹配到的字符串;(不是模式,而是模式匹配的結果)
\1:第一組括號中的pattern匹配到的字符串;
\2:第二組括號中的pattern匹配到的字符串;
後向引用:引用前面的括號中的模式所匹配到的字符串;
5、或者:
a|b:a或者b
(C|c)at:表示Cat或cat
C|cat:表示C或cat