grep和egrep的一些简单用法
首先介紹grep的一些常見用法:
?grep:根據(jù)模式搜索文本,并將符合模式的文本行顯示出來。
其基本格式為:grep [options] PATTERN [FILE...]
即:grep [選項(xiàng)] 匹配模式 [文件...];其中,中括號(hào)表示該選項(xiàng)可省略,...表示可以有多個(gè)。PATTERN:文本字符和正則表達(dá)式的元字符組合而成匹配條件。
下面介紹grep匹配模式中常用的幾個(gè)選項(xiàng)。
grep -i :表示忽略字符的大小寫;其基本用法為:grep -i PATTERN [FILE...];例如:匹配/etc/inittab文件中的字母a,并忽略其大小寫。其代碼如下:
其顯示結(jié)果如下圖,將會(huì)把所有匹配到的字符a,不管是小寫還是大寫都會(huì)先是出來,可以看到大寫字母也出現(xiàn),但匹配到?jīng)]有,卻看不出來。要想看到匹配效果,就需要借助下面這個(gè)選項(xiàng)了。
grep --color:表示匹配到的字符用其他顏色顯示出來;其基本用法為:grep -color PATTERN [FILE...];例如:還用上一個(gè)文件,匹配/etc/inittab文件中的字母a,并用其他顏色顯示出來。其代碼如下:
?其顯示結(jié)果將會(huì)把匹配到的字符a,用其他顏色顯示出來。如下圖所示:
要想顯示字符a,且不管是大寫還是小寫都顯示出來,可在命令行輸入如下代碼:
其顯示結(jié)果如下圖所示,可以看到不管是大寫還是小寫都可以匹配到。
grep -v:表示顯示沒有被模式匹配到的行;其用法為:grep -v PATTERN [FILE...];例如:依然用前面那個(gè)文件,在文件/etc/inittab中,顯示沒有字符a的行;其代碼如下:
其顯示結(jié)果將會(huì)把所有不含字符a的行都顯示出來。
grep -A n:表示顯示匹配到的行及其后面n行;其基本用法為:grep -A n PATTERN [FILE...];例如:在文件/etc/passwd中,顯示root用戶的后4行,其代碼如下:
其顯示結(jié)果如下圖:
可能有人會(huì)問,不是顯示下面4行么,怎么多顯示了幾行,其實(shí)該命令只是顯示匹配到root字符及其后面4行,要想只顯示用戶為root的后面4行,只需錨定詞首即可,代碼及結(jié)果如下:
grep -B n:表示顯示匹配到的行及其前面n行;其用法為:grep -B n PATTERN [FILE...]。例如:顯示文件/etc/fstab中字符proc的錢4行。其代碼如下:
其顯示結(jié)果為:
grep -C n:表示顯示匹配到的行及其該行前后各n行;其用法為:grep -C n PATTERN [FILE...]。例如:顯示文件/etc/fstab中字符boot前后各2行。其代碼及顯示結(jié)果如下:
grep -E:表示使用擴(kuò)展正則表達(dá)式,相當(dāng)于egrep,其用法跟其他選項(xiàng)配合使用。具體用法不在闡述。
?
基本正則表達(dá)式和擴(kuò)展正則表達(dá)式的異同:
先介紹基本正則表達(dá)式。基本正則表達(dá)式的元字符:
.:表示任意單個(gè)字符;
[]:表示匹配范圍內(nèi)的任意單個(gè)字符;
[^]:表示匹配指定范圍外的任意單個(gè)字符
字符集和包括:[:digit:]:表示數(shù)字;[:lower:]:表示小寫字母;[:upper:]:表示大寫字母;[:punct:]:表示標(biāo)點(diǎn)符號(hào);[:space:]:表示空格;[:alpha:]:表示所有字母;[:alnum:]:表示所有字母和數(shù)字。
?
匹配次數(shù)(默認(rèn)為貪婪模式,即盡可能長(zhǎng)的匹配):
*:表示匹配其前面的字符任意次
? ?例:給一串字符:a,b,ab,aab,acb,adb,amnb
? ?如a*b,則匹配字符有:b,ab,aab
.*:表示匹配任意長(zhǎng)度的任意字符
\?:表示匹配其前面的字符1次或0次
\{m,n\}:表示匹配其前面的字符至少m次,至多n次,如:
? ? \{1,\}:表示匹配至少一次
? ? \{0,3\}:表示匹配最多三次
位置錨定:
^:錨定行首,此字符后面的任意內(nèi)容必須出現(xiàn)在行首,如剛剛提到的'^root',表示該字符必須出 ? ?現(xiàn)在行首;
$:錨定行尾,此字符前面的任意內(nèi)容必須出現(xiàn)在行尾
^$:空白行
\<或\b:錨定詞首,其后面的任意字符必須作為單詞首部出現(xiàn)
\>或\b:錨定詞尾,其后邊的任意字符必須作為單詞尾部出現(xiàn)
如:\<root\>:在整個(gè)文件中,把root作為整個(gè)單詞出現(xiàn),詞首詞尾詞中都不行,如:mroot、rooter、monrooter均將不匹配。
?
分組:\(\)
? ? \(ab\)*:表示ab整體作為匹配字符,且匹配任意次
\(ab\)\{1,\}:表示ab整體作為匹配字符,且匹配至少一次
\(ab\):表示ab整體作為匹配字符
? ? 后向引用
? ? \1:匹配第一個(gè)左括號(hào)以及與之對(duì)應(yīng)的右括號(hào)所包括的所有內(nèi)容
? ? \2:匹配第二個(gè)左括號(hào)以及與之對(duì)應(yīng)的右括號(hào)所包括的所有內(nèi)容
? ? \3:匹配第三個(gè)左括號(hào)以及與之對(duì)應(yīng)的右括號(hào)所包括的所有內(nèi)容
? ? ......
? ? 如:新建文件test1,其內(nèi)容如下:
He love his lover.
She like her liker.
He love his liker.
She like her lover.
He like her.
She love he.
? ? # grep '\(l..e\).*\1' test1:表示匹配前面l開頭,e結(jié)尾中間為任意兩個(gè)字符的組,且前后必須相同;
? ? # grep 'l..e' test1:表示所有的都可以匹配
下面介紹擴(kuò)展正則表達(dá)式。擴(kuò)展正則表達(dá)式的元字符、位置錨定同基本正則表達(dá)式相同,不同之處在于次數(shù)匹配,且擴(kuò)展正則表達(dá)式多了|符號(hào)。
?
次數(shù)匹配:
*:表示其前字符任意次
?:表示其前字符0次或1次
+:表示匹配其前面的字符至少1次
{m,n}:表示至少m次,至多n次
|:即or,例:
? ? C|cat :表示匹配C或cat
? ? (C|c)at:表示以大寫或小寫c開頭的cat ??
? ? #grep -E ‘C|cat’ test5
? ? 或者
? ? #egrep ‘C|cat’ test5
egrep的用法除了在匹配次數(shù)上與grep不同外,其他基本相同,且grep -E [options] PATTERN [FILE...] ?等同于egrep [options] PATTERN [FILE...]?。
?
下面給出一些練習(xí)題,各位可以做些練習(xí)題,加深一下這些命令的用法。各練習(xí)題后面都配有參考答案,希望各位能自己先做練習(xí)然后再對(duì)照答案,不要直接看答案,那樣是沒有多少效果的,同時(shí)也希望各位能多多上機(jī),只有勤加練習(xí)才能記住各命令的用法。練習(xí)題中有些題目會(huì)設(shè)計(jì)到管道的用法,不會(huì)做的可以先看看管道的用法然后再做這些練習(xí)題。
?
練習(xí)一:
1、顯示/proc/meminfo文件中以不區(qū)分大小的s開頭的行;
? ? # grep '^s' /proc/meminfo -i ? 或者
# grep '^[sS]' /proc/meminfo
2、顯示/etc/passwd中以nologin結(jié)尾的行;?
? ? # grep 'nologin$' /etc/passwd
? ? 取出默認(rèn)shell為/sbin/nologin的用戶列表
? ? # grep 'nologin' /etc/passwd | cut -d: -f1
? ? 取出默認(rèn)shell為bash,且其用戶ID號(hào)最小的用戶的用戶名
? ? # grep 'bash$' /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1
3、顯示/etc/inittab中以#開頭,且后面跟一個(gè)或多個(gè)空白字符,而后又跟了任意非空白字符的行;
? ?# grep '^#[[:space:]]\{1,\}[^[:space:]]' /etc/inittab
4、顯示/etc/inittab中包含了:一個(gè)數(shù)字:(即兩個(gè)冒號(hào)中間一個(gè)數(shù)字)的行;
? ?# grep ':[0-9]:' /etc/inittab
5、顯示/boot/grub/grub.conf文件中以一個(gè)或多個(gè)空白字符開頭的行;
? ?# grep '^[[:space:]]\{1,\}' /boot/grub/grub.conf
6、顯示/etc/inittab文件中以一個(gè)數(shù)字開頭并以一個(gè)與開頭數(shù)字相同的數(shù)字結(jié)尾的行;
? ?# grep '\(^[0-9]\).*\1$' /etc/inittab
?
練習(xí)二:
1、找出某文件中的,1位數(shù),或2位數(shù);
? ? # grep '\<[[:digit:]][[:digit:]]\?\>' /etc/inittab ?或者
# grep '\<[0-9]\{1.2\}\>' /etc/inittab?
2、找出ifconfig命令結(jié)果中的1-255之間的整數(shù);?
? ? # ifconfig | egrep --color '\<[1-9]\>|\<[1-9][0-9]\>|\<1[0-9][0-9]\>|\<2[0-4][0-9]\>|\<25[0-5]\>'
? ? 注:該命令顯示結(jié)果可能會(huì)將非整數(shù)也顯示出來,請(qǐng)各位注意,系統(tǒng)默認(rèn)是不識(shí)別小數(shù)點(diǎn)的,所以它會(huì)把非整數(shù)拆分成兩個(gè)整數(shù)來對(duì)待,這點(diǎn)還請(qǐng)注意。
3、查找當(dāng)前系統(tǒng)上名字為student(必須出現(xiàn)在行首)的用戶的帳號(hào)的相關(guān)信息, 文件為/etc/passwd
? ? # grep '^student:' /etc/passwd
? ? 若在找出該用戶的ID號(hào),則為:# grep '^student:' /etc/passwd | cut -d: -f3 ?或者# id -u student
?
?
?
?
?
?
轉(zhuǎn)載于:https://blog.51cto.com/lq2419/1148355
總結(jié)
以上是生活随笔為你收集整理的grep和egrep的一些简单用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows phone 8 的新特性
- 下一篇: 深入了解Oracle ASM(一):基础