grep、正則表達式和擴展正則表達式的理解及運用
一 、grep的基本含義
我們可以從命令man grep中看到gerp命令的幫助文檔,從中我們可以得出grep、egrep、fgrep都是文本搜索工具,根據用戶指定的文本模式(搜索條件)對目標文件進行逐行搜索,顯示能匹配到的。
grep有三種變形:
grep:標準grep命令,支持基本正則表達式
egrep:擴展grep命令,支持基本及擴展的正則表達式
fgrep:fastgrep,它把所有的字母都看作單詞,即正則元字符不再特殊,而僅僅表示其自身的字母意思
grep使用語法格式爲:
grep [option]...'PATTERN' FILE...
grep [選項] …’基本正則表達式’ [文件]…
使用雙引號:字符串參數最好使用雙引號擴起來,一是以防被誤解爲shell命令,二是可以用來查找多個單詞組成的字符串,在調用變量的時候也要使用雙引號,比如grep"$MYVAR",否則無結果,在調用模式匹配是,應使用單引號
grep常用選項:
-v: 反向選取
-o:僅顯示匹配的字串,而非字串所在的行
-i:ignore-case,忽略字符大小寫
-E:支持使用擴展正則表達式
二、grep和正則表達式
正則表達式含義:是一類字符所書寫的模式,其中許多字符不表示其字面意義,而是表達控制或通配等功能。正則表達式中包含元字符,元字符是指不表示其字面意義,而用於額外功能性描述。
基本正則表達式的元字符:
字符匹配:
.: 匹配任意單個字符
[]: 匹配指定範圍內的任意單個字符
[0-9], [[:digit:]]:指包含數字字符
[a-z], [[:lower:]]:指包含小寫字符
[A-Z], [[:upper:]]:指包含大寫字符
[[:space:]]:指空白字符
[[:punct:]]:指特殊字符 標點符號等
[[:alpha:]]:指包含所有的大小寫字符
[[:alnum:]]:指包含所有的大小寫字符和數字字符
[^]:匹配一個不在指定範圍內的字符
次數匹配元字符:用於實現指定其前面的字符所能夠出現的次數
*: 任意長度,它前面的字符可以出現任意次
\?: 0次或1次,它前面的字符是可有可無的
\{m\}: m次,它前的字符要出現m次
\{m,n\}: 至少m次,至多n次
\{m,\}: 至少m次
位置錨定:
^:行首錨定:指寫在模式最左側
$:行尾錨定:指寫在模式最右側
^$:指空白行
不包含特殊字符的連續字符組成的串叫單詞:
\<:詞首,出現於單詞左側,\b
\>:詞尾,出現於單詞右側, \b
分組引用:
\(\):分組
\#: 引用第n個 括號所匹配到的內容,而非模式本身
示例:
1、顯示/etc/passwd中以nologin結尾的行
# grep nologin$ /etc/passwd
使用此命令結果如下
2、顯示/etc/inittab中包含了:一個數字:(即兩個冒號中間一個數字)的行
# grep “[0-9]” /etc/inittab
三、擴展正則表達式
擴展正則表達式是對基礎正則表達式添加了幾個特殊構成的
語法格式:
grep -E ‘表達式‘文件…
grep -E 'PATTERN' FILE...
egrep ‘表達式‘ 文件…
egrep 'PATTERN' FILE...
擴展正則表達式的元字符:
字符匹配:
.: 匹配任意單個字符
[]: 匹配指定範圍內的任意單個字符
[0-9], [[:digit:]]:指包含數字字符
[a-z], [[:lower:]]:指包含小寫字符
[A-Z], [[:upper:]]:指包含大寫字符
[[:space:]]:指空白字符
[[:punct:]]:指特殊字符 標點符號等
[[:alpha:]]:指包含所有的大小寫字符
[[:alnum:]]:指包含所有的大小寫字符和數字字符
[^]:匹配一個不在指定範圍內的字符
次數匹配元字符:用於實現指定其前面的字符所能夠出現的次數
*: 任意長度,它前面的字符可以出現任意次
\?: 0次或1次,它前面的字符是可有可無的
\{m\}: m次,它前的字符要出現m次
\{m,n\}: 至少m次,至多n次
\{m,\}: 至少m次
位置錨定:
^:行首錨定:指寫在模式最左側
$:行尾錨定:指寫在模式最右側
^$:^$,^[[:space:]]*$ 指空白行
不包含特殊字符的連續字符組成的串叫單詞:
\<:詞首,出現於單詞左側\b
\>:詞尾,出現於單詞右側\b
分組引用:
\(\):分組
\#: 引用第n個 括號所匹配到的內容,而非模式本身
或者:
|:表示或者
例:
A|B:A或者B
示例:
1、顯示/boot/grub/grub.conf文件中以一個或多個空白字符開頭的行
# grep -E "^[[:space:]]{1,}.*"/boot/grub/grub.conf