Linux正規表示式 grep

2021-08-11 15:03:00 字數 3383 閱讀 6845

一、正規表示式

正規表示式描述了乙個字串匹配的規則,常用來匹配滿足匹配規則的文字。它定義了自己的語法,正規表示式中的字元可以分為普通字元和元字元,元字元在正規表示式中有特殊的含義。先看一下簡單的正規表示式:

\bhelloworld\b

這個正規表示式用來精確匹配helloworld這個字串。\b是乙個元字元,表示匹配單詞的邊界(開始或結束),helloworld中的每個字元是普通字元。

1、常用的元字元包括以下幾種

元字元

說明

舉例

\b匹配字串邊界

\bhello\b--精確匹配hello

\s匹配空白符(tab,空格等)

hi\shi--匹配hi hi,不匹配hihi

\d匹配數字

p\bp--可以匹配p2p

\w匹配字母,數字,下劃線

p\wp--可以匹配p_p

.匹配除換行的任意字元

^,&分別匹配字串的開始和結束,對應於\b

^hello&--精確匹配hello

此外還有

1.1 管道符 |

表示或,用於多個匹配規則的匹配。如正規表示式 rule1 | rule2將從左向右進行匹配,滿足其中乙個匹配規則rule1或rule2即可。

1.2 分組 ( )

將正規表示式用()括起來,這樣()裡面的這部分正規表示式就是乙個組。然後可以和限定符結合定義該組表示式的重複次數,而不僅僅是某個字元的重複。

如(\d\.)表示數字***.重複3次。

1.3  [ ]

在匹配時,只需要匹配[ ]中的任意乙個字元即可,如定義乙個母音的匹配規則[aaeeiioouu]。

還可以用乙個範圍來表示需要匹配的字元,如

[0-9]  //匹配所有的數字

[a-z] //匹配所有的小寫字母

[a-z] //匹配所有的大寫字母

[a-za-z]//匹配所有的字母

注意,匹配時只能匹配到乙個字元,若要匹配到多個字元,如兩個,採用這種形式:^[0-9][0-9]&。

2、字元轉義\

匹配的字串中含有元字元時,必須使用轉義字元將元字元轉換成普通字元。如要查詢a.txt時,使用a\.txt。

3、限定符

當我們需要匹配5個數字時,可以使用\d\d\d\d\d這樣的形式,這樣書寫比較繁瑣,正規表示式提供了許多限定符來幫我們解決重複字元這個問題。如*是乙個限定符,表示前面的字元出現0次或更多次。^hi&.*^hi&可以匹配hi,中間是可重複的任意字元,然後是hi這樣的字串,可以匹配的字串包括hihi,hixxhi,hi***hi等等。

限定符說明*

重複0次或更多

+重複1次或更多

?重複0次或1次

重複n次

重複n次或更多

重複n到m次

如 ^\d-\d-\d& 匹配000-0000-0000這樣的形式。

4、反義

有時匹配規則描述起來比較複雜,往往用反義字元描述比較簡單,常用的反義字元有:

反義字元

說明\b

和\b對立,匹配不是開始或結束的位置

\s和\s對立,匹配非空白符

\d和\d對立,匹配非數字

\w和\w對立,匹配除字母,數字,下劃線的字元

[^x]

匹配除x之外的字元

[^abc]

匹配除abc之外的字元

5、通用字元類

posix還定義了一些特殊的字元類,可以供我們在正規表示式中使用

字元類 

說明/等價於

[[:alnum:]]

[a-za-z0-9]

[[:alpha:]]

[a-za-z]

[[:blank:]]

空格符[[:cntrl:]]

控制字元

[[:digit:]]

[0-9]

[[:graph:]]

非空字元

[[:lower:]]

[a-z]

[[:print:]]

可列印字元

[[:punct:]]

標點符號

[[:space:]]

空白符[[:upper:]]

[a-z]

[[:xdigit:]]

十六進製制數[0-9a-fa-f]

6、匹配規則

預設情況下正規表示式匹配是貪婪匹配,即匹配盡可能多的字元。

如匹配規則為:a.*b,當它應用於aabab時,會匹配到aabab,而不是abab或ab。

參考:正規表示式到底是什麼東西

二、grep命令

linux命令grep是乙個強大的文字搜尋工具。它有兩個變體,分別是egrep和fgrep。分別對應於grep -e和grep -f。

grep命令的命令格式為:grep [選項]...pattern [file]...。

其中pattern為正規表示式。而posix將正規表示式分為了兩種,分別是基本正規表示式(bre)和擴充套件正規表示式(ere)。grep命令使用bre,egrep使用ere。

bre和ere的區別主要在於元字元。

bre支援的元字元只有

^ $ . 

* 其他字元被識別為普通字元。

ere在bre的基礎上新增了  {},bre中只將{}當作普通字元對待,要使用此功能必須加\進行轉義,即「\」

(),bre中只將()當作普通字元對待,要使用此功能必須加\進行轉義,即「\(\)」

?  +  | 等。

grep命令最基本的用法是字元匹配,並把匹配的行列印出來。

還可以利用管道命令|和其他命令結合起來實現更複雜的功能。

ps:管道命令  command1 | command2 | command3,前乙個命令的輸出作為後乙個命令的輸入。

下面是一些簡單的例子:

2.1字元匹配

匹配檔案中以l開頭的文字,貪婪匹配,列印出所在的行:

2.2結合管道命令

查詢指定程序mentohust,將ps的輸出輸入到grep中進行過濾,結果如下:

Linux正規表示式grep

正規表示式是一種符號表示法,用於識別文字模式。linux處理正規表示式的主要程式是grep。grep搜尋與正規表示式匹配的行,並將結果輸送至標準輸出。1.grep匹配模式 grep按下述方式接受選項和引數 其中,regex表示正規表示式 1 grep options regex files 其中op...

Linux正規表示式 grep

grep命令 grep cinvabc word filename常用選項解釋 c 列印符合要求的行數。i 忽略大小寫。n 輸出符合要求的行及行號。v 列印不符合要求的行。a 後跟數字n 有無空格都可 列印符合要求的行和下面n行。b 後跟數字n,列印符合要求的行和上面n行。c 後跟數字n,列印符合要...

Linux正規表示式grep

正規表示式是一種符號表示法,用於識別文字模式。linux處理正規表示式的主要程式是grep。grep搜尋與正規表示式匹配的行,並將結果輸送至標準輸出。1.grep匹配模式 grep按下述方式接受選項和引數 其中,regex表示正規表示式 grep options regex files 其中opti...