1.概述
grep man手冊中解釋 "print lines mattching a pattern"翻譯成中文爲 按照匹配的模式打印匹配的行。
要注意兩點:
- 1.grep是按行打印的
- 2.是按照模式匹配的
grep [opyion] pattern [file …]
2.[option] 選項
grep的參數選項有很多,接收幾個常用的選項
- -n 顯示匹配的行號
- -v 反選
- -i 忽略大小寫
- -o 只打印匹配的字符串
- -E 使用擴展的正則表達式 與egrep 命令一樣
- -A 顯示匹配行和之後的#行也顯示 after grep -A ‘^core id’ /proc/cpuinfo
- -B 前面的#h行 before
- -C 前後各#行 context
- –color 顯示匹配的顏色
3.正則表達式元字符
- 字符匹配
. 任意單個字符
[] 指定範圍內的單個字符
[^] 指定範圍內除外的單個字符 - 次數匹配
* 匹配前面字符任意次
? 前面的字符可有可無
{m,n} 前面字符至少m次,至多n次 - 位置錨定
^ 行首
$ 行尾
< /b 單詞詞首
> /b 單詞詞尾 - 分組
()
/1/2/3
字符集合
具體 man 7 regex
[[:digit:]] 字符集合
[[:lower:]] 所有小寫字符集合
[[:upper:]] 所有大寫字符集合
[[:punct:]] 標點符號集合
[[:space:]] tab,space 等空白字符集合
[[:alpha:]] 等同[A-Za-z]
[[:alnum:]] 等同[A-Za-z0-9]
外層 [ ]表示匹配指定範圍內的單個字符,內層[:lower:] 所有的小寫字符
4.基礎正則表達式和擴展正則表達式
匹配字符:這部分和基本正則表達式一樣
匹配次數:
* 和基本正則表達式一樣
? 基本正則表達式是?,二這裏沒有\。
{m,n} 相比基本正則表達式也是沒有了\。
+ 匹配其前面的字符至少一次,相當於{1,}。
位置錨定:和基本正則表達式一樣。
分組及引用:
(string) 相比基本正則表達式也是沒有了\。
\1 引用部分和基本正則表達式一樣。
\n 引用部分和基本正則表達式一樣。
或者:
a|b :匹配a或b,注意a是指 | 的左邊的整體,b也同理。比如 C|cat 表示的是 C或cat,而不是Cat或cat,如果要表示Cat或cat,則應該寫爲 (C|c)at 。記住(string)除了用於引用還用於分組。
注1:默認情況下,正則表達式的匹配工作在貪婪模式下,也就是說它會盡可能長地去匹配,比如某一行有字符串 abacb,如果搜索內容爲 "a.b" 那麼會直接匹配 abacb這個串,而不會只匹配ab或acb。
注2:所有的正則字符,如 [ 、 、( 等,若要搜索 * ,而不是想把 * 解釋爲重複先前字符任意次,可以使用 * 來轉義。
grep fgrep egrep
grep 支持基礎正則表達式 egrep 支持擴展正則表達式
grep egrep 由於grep搜索要消耗大量的資源,耗費cpu
fgrep 快速查找字符串 不包含元字符 ,直接搜索字符串 用fgrep
5.技巧 [\S\s]
\s 指空白、換行、tab縮進等所有的空白
\S 與\s 相反
[\S\s] 表示所有的字符
[\S\s] [\W\w] 匹配包括出現換行的字符
. 不匹配出現換行的字符
所以一般用[\s\S]表示匹配所有的字符
區別文件名通配符
* 任意長度的任意字符
? 任意單個字符
[] 指定範文內的單個字符
[^] 指定範圍除外的單個字符
6.總結
grep 的用法需要多練,用熟之後元字符就記住了;
用grep來匹配日誌信息會很有用,可以用此有熟悉grep命令;
如果平時製作字符串的匹配,用fgrep耗內存較少。