grep及基本正則表達式


grep (Global search Regular Exmpression and Printing) 命令是Linux中最常用的命令之一,用於搜索給定文本文件中匹配某個特定模式(pattern)的行。其中模式爲文本字符及正則表達式的元字符組合而成。


首先來介紹一下grep的基本用法,通過man grep 可以看到grep的幫助信息:

144357689.jpg

那麼grep,egrep,fgrep有何區別呢?

grep: 默認支持基本正則表達式;

egrep:支持 擴展正則表達式;

fgrep: 不支持正則表達式元字符,但搜索字符串的速度更快;


1. grep的常用選項(OPTIONS)

--color=auto:高亮顯示匹配到的字符串;

144415660.jpg

-v: 反向選取,只顯示不符合模式的行;

-o: 只顯示被模式匹配到的字串,而不是整個行;

-i: 不區分字符大小寫;

-A #:顯示匹配到的行時,順帶顯示其後面的#個行;

-B #:前面的#行;

-C #:前後的#行;

-E: 使用擴展的正則表達式, grep -E = egrep


grep命令的模式十分靈活,可以是字符串,也可以是變量,還可以是正則表達式。需要注意的是,無論模式是何種形式,只要模式中包含空格,就需要使用雙引號將模式引起來,如果不加雙引號,空格後的單詞容易被誤認爲是文件名。大部分情況下,使用單引號將模式引起來也是可以的。


2. 基本正則表達式

2.1 基本元字符

元字符:不表示字符本身的意義,而用於額外功能性的描述

. :點號,匹配任意單個字符。

[ ]:匹配指定範圍內的任意單個字符: [a-z], [A-Z], [0-9]

[^ ]:匹配指定範圍外的任意單個字符:如grep "[^0-9]" file ,表示除了數字,都匹配


2.2 次數匹配

注意:grep默認工作在貪婪模式下,即儘可能長地去匹配符合模式的內容。

示例,如有文本text 包含以下內容:

145828759.jpg

"a.b"表示匹配a和b中間有一個任意字符的內容

145828177.jpg

*:星號,匹配緊挨在其前面的字符任意次(包括0次)。

"a*b"表示匹配b前的a任意次

145828339.jpg

.*:點星組合,匹配任意長度的任意字符(包括0次)。

"a.*b" 表示匹配ab之間的任意字符任意次。

145828607.jpg

\?: 匹配其前面的字符1次或0次  ("\"爲轉義字符)

"a\?b" 表示匹配b前的a 1次或0次

150622283.jpg

\{m,n\} :匹配其前面的字符至少m次,至多n次

       \{0,n\}: 至多n次;0-n次;

       \{m,\}:至少m次

       \{m\}: 精確匹配m次;

例如:\{2,\}  表示匹配至少2次

151432315.jpg


2.3 字符集合

[:digit:] 所有數字 0-9        
[:lower:] 所有小寫字母  a-z
[:upper:] 所有大寫字母 A-Z
[:punct:] 所有標點符號
[:space:] 表示空格或tab鍵
[:alpha:] 表示所有字母(包含大小寫)a-zA-Z
[:alnum:] 表示所有字母和數字  a-zA-Z0-9

注意,需要額外的[ ]把表達式括起來

例如: [[:digit:]] ,表示匹配0到9中任意一個數字,相當於[0-9],如果取反就是[^[:digit:]],即[^0-9].


2.4 位置錨定

^: 錨定行首的符合條件的內容,用法格式“^pattern”;

如查找/etc/passwd文件中以root開頭的行:

153241932.jpg

$: 錨定行尾的符合條件的內容,用法格式“pattern$”;

如查找/etc/passwd中以bash結尾的行:

153241308.jpg

^$: 結合使用表示查找空白行
\<: 錨定詞首,用法格式:\<pattern
\>: 錨定詞尾,用法格式:pattern\>
\<pattern\>:可用於查找某個獨立的單詞

如查找/etc/passwd文件中以r開頭,t結尾,中間包含兩個任意字符的單詞

153823774.jpg

注意:與grep "r..t" /etc/passwd結果的區別:

153823243.jpg


2.5 分組符號

\(\)
  \(ab\):表示ab整體作爲匹配字符
  \(ab\)* ::表示ab整體作爲匹配字符,且匹配任意次
  \(ab\)\{1,\}:表示ab整體作爲匹配字符,且匹配至少一次
分組還可以後向引用:
\1: 引用第一個左括號以及與之對應的右括號所包括的所有內容
\2: 引用第二個左括號以及與之對應的右括號所包括的所有內容
\3: 引用第三個左括號以及與之對應的右括號所包括的所有內容

如有text文本內容如下:

155151339.jpg

要匹配l..e.*l..er 的模式可以使用後向引用\1

grep "\(l..e\).*\1r" text 表示匹配結果如下:

155151504.jpg



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章