grep (Global search Regular Exmpression and Printing) 命令是Linux中最常用的命令之一,用於搜索給定文本文件中匹配某個特定模式(pattern)的行。其中模式爲文本字符及正則表達式的元字符組合而成。
首先來介紹一下grep的基本用法,通過man grep 可以看到grep的幫助信息:
那麼grep,egrep,fgrep有何區別呢?
grep: 默認支持基本正則表達式;
egrep:支持 擴展正則表達式;
fgrep: 不支持正則表達式元字符,但搜索字符串的速度更快;
1. grep的常用選項(OPTIONS):
--color=auto:高亮顯示匹配到的字符串;
-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 次數匹配
示例,如有文本text 包含以下內容:
"a.b"表示匹配a和b中間有一個任意字符的內容
*:星號,匹配緊挨在其前面的字符任意次(包括0次)。
"a*b"表示匹配b前的a任意次
.*:點星組合,匹配任意長度的任意字符(包括0次)。
"a.*b" 表示匹配ab之間的任意字符任意次。
\?: 匹配其前面的字符1次或0次 ("\"爲轉義字符)
"a\?b" 表示匹配b前的a 1次或0次
\{m,n\} :匹配其前面的字符至少m次,至多n次
\{0,n\}: 至多n次;0-n次;
\{m,\}:至少m次
\{m\}: 精確匹配m次;
例如:\{2,\} 表示匹配至少2次
2.3 字符集合
注意,需要額外的[ ]把表達式括起來
例如: [[:digit:]] ,表示匹配0到9中任意一個數字,相當於[0-9],如果取反就是[^[:digit:]],即[^0-9].
2.4 位置錨定
如查找/etc/passwd文件中以root開頭的行:
如查找/etc/passwd中以bash結尾的行:
如查找/etc/passwd文件中以r開頭,t結尾,中間包含兩個任意字符的單詞
2.5 分組符號
如有text文本內容如下:
要匹配l..e.*l..er 的模式可以使用後向引用\1
grep "\(l..e\).*\1r" text 表示匹配結果如下: