天天看點

9.1 正則介紹_grep上 9.2 grep中 9.3 grep下

正則的介紹

定義是:它使用單個字元串來描述或比對一系列符合某個句法規則的字元串。在很多文本編輯器或其他工具裡,正規表達式通常用來檢索和替換那些符合模式的文本内容。許多程式設計語言也都支援利用正規表達式進行字元串操作。常用的工具有grep,sed,awk等,都是針對文本的行進行操作。

grep上

該指令的格式為:grep [-cinvABC] 'word' filename,常用指令如下:

-c:表示列印符合要求的行數。

-i:表示忽略大小寫。

-n:表示輸出符号要求的行及其行号。

-v:表示列印不符和要求的行。

-A:後面跟一個數字(有無空格都可以),例如-A2表示列印符合要求的行以及下面兩行。

-B:後面跟一個數字,例如-B2表示列印符合要求的行以及上面兩行。

-c:後面跟一個數字,例如-C2表示列印符合要求的行以及上下各兩行。

首先看看-A、-B、和-C這3個選項的用法。

-A2會把包含halt的行以及這行下面的兩行都列印出來:

grep預設幫我們把比對到的字元串标注了紅色。

-B2會把包含halt的行以及這行上面的兩行都列印出來:

-C2:會把包含halt的行以及這行上下的兩行都列印出來:

9.2 grep中

過濾出帶有某個關鍵詞的行,并輸出行号。

示例指令如下:

前面的數字顯示為綠色,表示行号。

過濾出不帶有某個關鍵詞的行,并輸出行号。

過濾出所有包含數字的行 示例指令如下:

隻要有一個數字就算比對到了

過濾出所有不包含數字的行 示例指令如下:

和上一個例子的結果正好相反,隻要是包含一個數字,就不顯示。

過濾掉所有以#開頭的行

過濾掉所有空行和以#開頭的行

在正規表達式中,^表示行的開始,$表示行的結尾,那麼空行則可以用^$表示。如何列印出不以英文字母開頭的行呢?先來自定義一個檔案,如下所示:

在test.txt中寫幾行字元串,用來做實驗,如下所示:

如果是數字就用[0-9]這樣的形式(當遇到類似[15]的形式時,表示隻含有1或者5)。如果要過濾數字以及大小寫字母,則要寫成類似[0-9a-zA-Z]的形式。[^字元]表示除[]内字元之外的字元。注意,把^寫到方括号裡面和外面是有差別的。

過濾出任意一個字元和重複字元

.表示任意一個字元。上例中,r.o表示把r和o之間有一個任意字元的行過濾出來。

*表示零個或多個*前面的字元。上例中,ooo*表示oo,ooo,oooo....或者更多的o。

上例中,.*表示零個或多個任意字元,空行也包含在内,它會把/etc/passwd檔案裡面的所有行都比對到。

指定要過濾出的字元出現的次數

示例如下:

這裡用到了符号{},其内部為數字,表示前面的字元要重複的次數。需要強調的是,{}左右都需要加上轉義字元\。另外,使用“{}”還可以表示一個範圍,具體格式為{n1,n2},其中n1<n2,表示重複n1到n2次前面的字元,n2還可以為空,這時表示大于等于n1次。

9.3 grep下

為了試驗友善,把test.txt編輯成如下内容:

過濾出一個或多個指定的字元

和grep不同,這裡egerp使用的是符号+,它表示比對1個或多個+前面的字元,這個“+”是不支援被grep直接使用的。包括上面的{},也是可以被egrep使用,而不用加\轉義。示例如下:

過濾出零個或一個指定的字元

過濾出字元串1或者字元串2

egrep中()的應用

這裡用()表示一個整體,上例中會把包含rooo或者rato的行過濾出來,另外也可以把()和其他符号組合在一起,例如(oo)+就表示1個或者多個oo。示例指令如下:

繼續閱讀