一秽晚、grep 文本搜索工具
語(yǔ)法:
grep [OPTIONS] PATTERN [FILE...]
選項(xiàng):
-v <!--顯示不被pattern匹配到的行-->
-i <!--忽略字符大小寫(xiě)-->
-n <!--顯示匹配的行號(hào)-->
-c <!--統(tǒng)計(jì)匹配的行數(shù)-->
-o <!--僅顯示匹配到的字符串-->
-q <!--靜默模式雄可,不輸出任何信息,可以查看$?判斷命令是否成功執(zhí)行-->
-A # <!--after, 后#行-->
-B # <!--before, 前#行-->
-C # <!--context, 前后各#行-->
-e <!--實(shí)現(xiàn)多個(gè)選項(xiàng)間的邏輯or關(guān)系-->
-w <!--匹配整個(gè)單詞-->
-E <!--使用ERE擴(kuò)展正則表達(dá)式,相當(dāng)于egrep命令-->
-F <!--相當(dāng)于fgrep,不支持正則表達(dá)式-->
實(shí)驗(yàn):
-
在/etc/passwd中搜索不包含nologin字符串的行
命令:grep -v nologin /etc/passwd
-
在/etc/passwd中搜索包含tom(不分大小寫(xiě))字符串的行
命令:grep -i tom /etc/passwd
-
在/etc/passwd顯示所有搜索到的bash字符串,并在字符串前輸出其所在的行號(hào)
命令:grep -on bash /etc/passwd
在/etc/passwd中搜索包含mail的行康聂,并且顯示其后三行/前三行/前后各三行
命令:
grep -A 3 mail /etc/passwd
grep -B 3 mail /etc/passwd
grep -C 3 mail /etc/passwd
- 在/etc/passwd中搜索有單詞root,shutdown,bin的行
命令:grep -we root -we shutdown -we bin /etc/passwd
二、正則表達(dá)式 regular expressions
(一)定義:
由一類(lèi)特殊字符及文本字符所編寫(xiě)的模式胞四,其中有些字符(元字符)不表示字符字面意義恬汁,而表示控制或通配的功能。
(二)程序支持:
grep, sed, awk, vim等
(三)分類(lèi):
基本正則表達(dá)式(BRE)
擴(kuò)展正則表達(dá)式(ERE)
(四)元字符分類(lèi):
字符匹配辜伟、匹配次數(shù)氓侧、位置錨定、分組
三导狡、基本正則表達(dá)式元字符
(一)字符匹配
. <!--匹配任意單個(gè)字符-->
[] <!--匹配指定范圍內(nèi)的任意單個(gè)字符-->
[^] <!--匹配指定范圍外的任意單個(gè)字符-->
[:digit:] <!--十進(jìn)制數(shù)字-->
[:alpha:] <!--任何英文大小寫(xiě)字符-->
[:alnum:] <!--字母和數(shù)字-->
[:lower:] <!--小寫(xiě)字母-->
[:upper:] <!--大寫(xiě)字母-->
[:blank:] <!--空白字符(空格和制表符)-->
[:space:] <!--水平和垂直的空白字符-->
(二)匹配次數(shù)
* <!--匹配前面的字符任意次约巷,包括0次-->
.* <!--任意長(zhǎng)度的任意字符-->
\? <!--匹配前面的字符0或1次-->
\+ <!--匹配前面的字符至少1次-->
\{n\} <!--匹配前面的字符n次-->
\{m,n\} <!--匹配前面的字符至少m次,至多n次-->
\{,n\} <!--匹配前面的字符至多n次-->
\{n,\} <!--匹配前面的字符至少n次-->
-
實(shí)驗(yàn):
新建文本文件file1旱捧,文件內(nèi)容如下:
-
搜索包含以g開(kāi)頭独郎,中間有任意個(gè)數(shù)的o,以gle結(jié)束的字符串廊佩;
命令:grep go*gle file1
-
搜索包含以g開(kāi)頭囚聚,中間至少2個(gè)字母至多5個(gè)字母,以gle結(jié)束的字符串标锄;
命令:grep "g[[:alpha:]]\{2,5\}gle" file1
-
搜索包含以g開(kāi)頭,中間至多1個(gè)字母茁计,以gle結(jié)束的字符串
命令:grep "g[[:alpha:]]\?gle" file1
-
(三)位置錨定
^ <!--行首錨定料皇,用于模式的最左側(cè)-->
$ <!--行尾錨定,用于模式的最右側(cè)-->
^PATTERN$ <!--用于模式匹配整行-->
^$ <!--空行星压,不含空格-->
^[[:space:]]*$ <!--空白行践剂,可能含空格-->
\< 或\b <!--詞首錨定,用于單詞模式的左側(cè)-->
\> 或\b <!--詞尾錨定娜膘;用于單詞模式的右側(cè)-->
\<PATTERN\>匹配整個(gè)單詞
(四)分組逊脯、或者
- 分組:
\(\)
將一個(gè)或多個(gè)字符捆綁在一起,當(dāng)作一個(gè)整體進(jìn)行處理 - \1表示從左側(cè)起第一個(gè)左括號(hào)以及與之匹配右括號(hào)之間的模式所匹配到的字符竣贪,以此類(lèi)推
- 例如:
\(string1\+\(string2\)*\)
\1:string1\+\(string2\)* \2:string2
- 后向引用:引用前面的分組括號(hào)中的模式所匹配字符军洼,而非模式本身
- 或者:\|
abc\|cd <!--abc或者cd-->
a\|bc <!--a或者bc-->
\(a\|b\)c <!--ac或者bc-->
- 實(shí)驗(yàn):
-
在/etc/passwd搜索以a開(kāi)頭的用戶(hù)及其UID,并且按照UID從大到小排序
命令:grep "^a" /etc/passwd | cut -d: -f1,3 | sort -nr -t: -k2
-
在/etc/passwd搜索以s開(kāi)頭中間至少1個(gè)英文或數(shù)字字符以d結(jié)束的單詞演怎,英文不分大小寫(xiě)
命令:grep -i "\<s[[:alnum:]]\+d\>" /etc/passwd
-
在/etc/passwd搜索用戶(hù)名以t開(kāi)頭匕争,且同行包含與用戶(hù)名相同單詞的行
命令:grep "\(^t.*\>\).*\1" /etc/passwd
可以從上圖看到,tim用戶(hù)所在的行后tam單詞也匹配模式爷耀,但是并未搜索到甘桑。這證明后向引用前方分組括號(hào)中所匹配的字符,而非模式本身。
-
四跑杭、egrep和擴(kuò)展正則表達(dá)式
(一)egrep
egrep = grep -E 铆帽,語(yǔ)法與grep相同
(二)擴(kuò)展正則表達(dá)式元字符
- 擴(kuò)展正則表達(dá)式與基本正則表達(dá)式的語(yǔ)法基本相同德谅,僅部分元字符刪減了\符號(hào)
- 字符匹配,擴(kuò)展正則表達(dá)式字符匹配元字符與基本正則表達(dá)式相同
. <!--任意單個(gè)字符-->
[] <!--指定范圍的字符-->
[^] <!--不在指定范圍的字符-->
- 匹配次數(shù)
* <!--匹配前面字符任意次-->
? <!--0或1次女阀,比基本正則表達(dá)式省略了\-->
+ <!--1次或多次,比基本正則表達(dá)式省略了\-->
{m} <!--匹配m次浸策,比基本正則表達(dá)式省略了\-->
{m,n} <!--至少m,至多n次庸汗,比基本正則表達(dá)式省略了\-->
- 位置錨定,擴(kuò)展正則表達(dá)式位置錨定元字符與基本正則表達(dá)式相同
^ <!--行首錨定-->
$ <!--行尾錨定-->
\<, \b <!--詞首錨定-->
\>, \b <!--語(yǔ)尾錨定-->
- 分組蚯舱、或者
() <!--分組,比基本正則表達(dá)式省略了\-->
\1, \2,... <!--后向引用-->
abc|cd <!--abc或者cd枉昏,比基本正則表達(dá)式省略了\-->
a|bc <!--a或者bc,比基本正則表達(dá)式省略了\-->
(a|b)c <!--ac或者bc兄裂,比基本正則表達(dá)式省略了\-->