溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

grep與正則達式

發(fā)布時間:2020-06-20 09:07:15 來源:網(wǎng)絡(luò) 閱讀:215 作者:liu008qing 欄目:系統(tǒng)運維

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)

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI