概念:
grep (Globally search a Regular Expression and Print)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。
grep:傳統的grep程序,支持基本正則表達式
egrep:擴展的grep程序,支持擴展正則表達式
正則表達式:簡單來說就是,用一串自己定義的條件字符串,去匹配檢索文檔中符合條件的字符。
grep基本格式:
grep [OPTIONS] PATTERN [FILE...]
常用選項:
-o:只顯示被模式匹配到的內容
-i:(ignore case) 搜索時不區分字符大小寫
-v:顯示不能夠被模式匹配到的行
-E:使用擴展正則表達式
-A #:顯示被模式匹配到的行以及下#行
-B #:顯示被模式匹配到的行以及上#行
-C #:顯示被模式匹配到的上下#行
--color[=WHEN], --colour[=WHEN] :
用於設置匹配到的字符,顯示高亮顏色否,有三個選項 auto ,always ,never
例如:
基本正則表達式元字符:
字符匹配:
. :匹配任意單個字符
[]:指定範圍內的任意單個字符
[^]:指定範圍外的任意單個字符
次數匹配:在期望匹配字符後面提供一個控制符,用於表達匹配其前面字符指定的次數
* :任意長度,表示0次,1次或多次;
.*:任意長度的任意字符(工作於貪婪模式,儘可能長的進行匹配)
\?:匹配其前的字符0次或1次,表示其左側字符可有可無
\+:匹配其前面的字符1次或多次,表示其左側字符至少出現一次
\{m\}:精確匹配其左側字符出現m次
\{m,n\}:至少m次,至多n次:
\{0,n\}:至多n次
\{m,\}:至少m次
位置錨定:
^:錨定行首,形如:^PATTERN
$:錨定行尾,形如:PATTERN$
^PATTERN$:用模式來匹配整行
例如:
grep "^$" 匹配空白字符的行(有空格的行不能匹配)
grep "^[[:space:]]*$" 匹配所有空行(可以有空格)
grep "^sh.*sh$" /etc/passwd 匹配/etc/passwd文件中以sh開始,sh結尾的整行
單詞錨定:由非特殊字符組成的連續的字符串
\<:錨定詞首 也可用\b,形如:\<PATTERN \bPATTERN
例如:grep "\<sh" /etc/passwd 匹配/etc/passwd文件中以“sh”開頭的單詞
\>:錨定詞尾,也可以用\b,形如:PATTERN\> PATTERN\b
\<PATTERN\>:匹配PATTERN能匹配的整個單詞
分組匹配:
\(PATTERN\)
注意:分組中的模式,在某次的具體匹配過程中所匹配到的字符,可以被grep記憶(保存於內置 的變量中,這些變量時\1,\2,...),因此,還可以被引用
\1:引用,模式中左到右,由第一個左括號以及與之對應的右括號中的模式所匹配到的內容
\2:引用,模式自左而右,由第二個左括號以及與之對應的右括號中的模式所匹配到的內容
例如:
grep "\(a.b\).*\1" FILE.. 用於匹配文件行中出現了"a.b",且後面再次出現了前方“a.b”匹配到的相同字符串
如圖:
amb hello amb 匹配
amb hello anb 不匹配 \1匹配的是前面匹配到的內容amb,而非\(a.b\)模式
擴展的正則表達式元字符:(無特殊說明則用法和基本正則表達式相同)
字符匹配:
. :匹配任意單個字符
[]:指定範圍內的任意單個字符
[^]:指定範圍外的任意單個字符
次數匹配:
*:任意次
?:0或1次
+:至少1次
{m}:精確匹配m次
{m,n}:至少m次,至多n次
{m,}:至少m次
{0,n}:至多n次
位置錨定:
^:行首
$:行尾
\<,\b:詞首
\>,\b:詞尾
^$:空白行
分組:
(PATTERN):引用\1,\2,...
或者:(兩側的所有內容)
a|b :a或者b
abc|CBA: abc或者CBA
egrep(grep -E)命令:(基本和grep一樣)
grep -E PATTERN FILE...
egrep PATTERN FILE...
練習:
1.顯示/proc/meminfo文件中以大寫或小寫S開頭的行;
# grep -i "^s" /proc/meminfo --color=auto 或;
# grep "^[sS]" /proc/meminfo --color=auto
用擴展正則表達式書寫:
# egrep -i "^s" /proc/meminfo --color=auto
2.顯示/etc/passwd文件中其默認shell爲非/sbin/nologin的用戶
# grep -v "nologin$" /etc/passwd ;-v 顯示不被匹配到的行
用擴展正則表達式書寫:
# grep -E -v "nologin$" /etc/passwd ;-E 表示使用擴展正則表達式
3.找出當前系統上其用戶名和默認shell相同的用戶的信息
# grep "^\(.*\)\>.*\1$" --color=auto /etc/passwd
用擴展正則表達式書寫:
# grep "^(.*)\>.*\1$" --color=auto /etc/passwd