您好,登錄后才能下訂單哦!
grep是一個行編輯器,它的默認動作是搜索與給定模式匹配的行顯示到屏幕上來。它的變種程序包括egrep和fgrep。
正則表達式是用戶定義的、Linux工具用來過濾文本的模式模板。正則表達式利用元字符來表示數(shù)據(jù)流中的一個或多個字符。
正則表達式(Regual Expression,REGEXP)包括BRE和ERE兩種,BRE就是基本正則表達式,而ERE是擴展正則表達式。
grep使用的元字符是BRE,egrep使用的元字符是ERE,而fgrep不使用元字符。而這三個命令可以使用不同的選項進行互通。接下來,我們來看看grep的用法。
一、grep
1. 格式
grep [options] ? ? PATTERN ? ? ?[FILE...]
2. 選項
-o:只顯示匹配的行中與PATTERN相匹配的部分。
-i: 忽略PATTERN和輸入文件中大小寫的區(qū)別
-v:反選,只顯示沒有被PATTERN匹配到的行
-q:靜默模式,找到匹配的內(nèi)容,則命令的執(zhí)行狀態(tài)返回值為0,否則為非0。
-A NUM:打印緊隨匹配的行之后的下文NUM行。
-B NUM: 打印緊隨匹配的行之前的上文NUM行。
-C NUM: 打印匹配出來的行的上下文各NUM行。
二、基本正則表達式
類型 | 元字符 | 解釋 |
字符匹配 | . | 匹配任意單個字符 |
[] | 匹配指定范圍內(nèi)的任意單個字符 | |
[^] | 匹配指定范圍外的單個字符 | |
匹配次數(shù) | * | 匹配其前的字符任意次,0次,1次或者多次 |
.* | 匹配任意長度的任意字符 | |
\? | 匹配其前的字符0次或者1次,即其前面的字符可有可元 | |
\+ | 匹配其前的字符1次或者多次,即其前面的字符至少出現(xiàn)1次 | |
\{m\} | 匹配其前的字符m次,精確匹配 | |
\{m,n\} | 匹配其前的字符至少m次,至多n次 | |
? ?\{0,n\} | 匹配其前的字符最多n次 | |
? ?\{m,\} | 匹配其前的字符最少m次 | |
位置錨定 | ^ | 錨定行首,寫在模式的最左側(cè),指定的字符串只能出現(xiàn)在行首 |
$ | 錨定行尾,寫在模式的最右側(cè) | |
^PATTERN$ | 用PATTERN來匹配整行 | |
^$ | 表示空行,連空格都不能包含,不包括任意字符 | |
^[[:spaces:]]* | 表示空行或者包括空白字符的行 | |
\<PATTERN | 錨定詞首 | |
\bPATTERN | 錨定詞首 | |
PATTERN\> | 錨定詞尾 | |
\<PATTERN>\ | 精確錨定單詞 | |
分組及引用 | \(PATTERN\) | 將一個或者多個字符捆綁在一起,當作一個整體進行處理; |
分組括號中的模式匹配到的內(nèi)容會被正則表達式引擎自動記錄于內(nèi)部的變量中,這些變量為: \1: 模式從左側(cè)起,第一個左括號以及與之匹配到的右括號之間的字符 \2:模式從左側(cè)起,第二個左括號以及與之匹配到的右括號之間的字符 |
三、擴展正則表達式
類型 | 元字符 | 解釋 |
字符匹配 | . | 匹配任意單個字符 |
[] | 匹配指定范圍內(nèi)的任意單個字符 | |
[^] | 匹配指定范圍外的單個字符 | |
匹配次數(shù) | * | 匹配其前的字符任意次,0次,1次或者多次 |
.* | 匹配任意長度的任意字符 | |
? | 匹配其前的字符0次或者1次,即其前面的字符可有可元 | |
+ | 匹配其前的字符1次或者多次,即其前面的字符至少出現(xiàn)1次 | |
{m} | 匹配其前的字符m次,精確匹配 | |
{m,n} | 匹配其前的字符至少m次,至多n次 | |
? ?{0,n} | 匹配其前的字符最多n次 | |
? ?{m,} | 匹配其前的字符最少m次 | |
位置錨定 | ^ | 錨定行首,寫在模式的最左側(cè),指定的字符串只能出現(xiàn)在行首 |
$ | 錨定行尾,寫在模式的最右側(cè) | |
^PATTERN$ | 用PATTERN來匹配整行 | |
^$ | 表示空行,連空格都不能包含,不包括任意字符 | |
^[[:spaces:]]* | 表示空行或者包括空白字符的行 | |
\<PATTERN | 錨定詞首 | |
\bPATTERN | 錨定詞首 | |
PATTERN\> | 錨定詞尾 | |
\<PATTERN>\ | 精確錨定單詞 | |
或 | ? | | 或,以|為分隔,表示或者為|左邊,或者為|右邊 C|cat表示C或者cat |
分組及引用 | (PATTERN) | 將一個或者多個字符捆綁在一起,當作一個整體進行處理; |
分組括號中的模式匹配到的內(nèi)容會被正則表達式引擎自動記錄于內(nèi)部的變量中,這些變量為: \1: 模式從左側(cè)起,第一個左括號以及與之匹配到的右括號之間的字符 \2:模式從左側(cè)起,第二個左括號以及與之匹配到的右括號之間的字符 |
四、 BRE和ERE的區(qū)別: 從上面的兩個表可以看出基本正則表達式和擴展正則表達式的區(qū)別,那就是擴展正則表達式在進行次數(shù)匹配和分組時的元字符不再需要\進行轉(zhuǎn)義;另外擴展正則表達式多了一個或的元字符。
五、 練習:前面提到了這么多,一起來練習下吧。
1、顯示/proc/meminfo文件中以大寫或小寫S開頭的行;
# grep -i '^s' /proc/meminfo
# grep '^[Ss]' /proc/meminfo
# grep -E '^(S|s)' /proc/meminfo
2、顯示/etc/passwd文件中其默認shell為非/sbin/nologin的用戶;
# grep -v "/sbin/nologin$" /etc/passwd | cut -d: -f
3、顯示/etc/passwd文件中其默認shell為/bin/bash的用戶; 進一步:僅顯示上述結(jié)果中其ID號最大的用戶;
# grep "/bin/bash$" /etc/passwd | sort -t: -k3 -n | tail -1 | cut -d: -f1,7
4、找出/etc/passwd文件中的一位數(shù)或兩位數(shù);
# grep "\<[0-9][0-9]\?\>" /etc/passwd
# grep "\<[0-9]\{1,2\}\>" /etc/passwd
5、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行;
# grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf
6、顯示/etc/rc.d/rc.sysinit文件中,以#開頭,后面跟至少一個空白字符,而后又有至少一個非空白字符的行;
# grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit
7、找出netstat -tan命令執(zhí)行結(jié)果中以'LISTEN'結(jié)尾的行;
# netstat -tan | grep "LISTEN[[:space:]]*$"
8、添加用戶bash, testbash, basher, nologin(SHELL為/sbin/nologin),而找出當前系統(tǒng)上其用戶名和默認shell相同的用戶;
# grep "^\([[:alnum:]]\{1,\}\):.*\1$" /etc/passwd
9、擴展題:新建一個文本文件,假設(shè)有如下內(nèi)容:
He like his lover.
He love his lover.
He like his liker.
He love his liker.
找出其中最后一個單詞是由此前某單詞加r構(gòu)成的行。
[root@liuqing tmp]# grep "\(l..e\).*\1" ?love.txt
10. 顯示ifconfig命令輸出結(jié)果中的IP地址。
~]# ifconfig | grep ?-E ?-o ?"\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>(.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>){3}"
六、三個命令的互換
grep -E表示使用擴展正則表達式(egrep),? -F表示將模式視為一個固定的字符串(fgrep)
egrep -G表示使用基本正則表達式(grep), -F表示將模式視為一個固定的字符串(fgrep)
fgrep -E表示使用擴展正則表達式(egrep),? ? ? ?-G表示使用基本正則表達式(grep)
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。