linux grep文本搜索工具

1.概述

grep man手冊中解釋 "print lines mattching a pattern"翻譯成中文爲 按照匹配的模式打印匹配的行。
要注意兩點:

  • 1.grep是按行打印的
  • 2.是按照模式匹配的

grep [opyion] pattern [file …]

2.[option] 選項

grep的參數選項有很多,接收幾個常用的選項

  1. -n 顯示匹配的行號
  2. -v 反選
  3. -i 忽略大小寫
  4. -o 只打印匹配的字符串
  5. -E 使用擴展的正則表達式 與egrep 命令一樣
  6. -A 顯示匹配行和之後的#行也顯示 after grep -A ‘^core id’ /proc/cpuinfo
  7. -B 前面的#h行 before
  8. -C 前後各#行 context
  9. –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耗內存較少。

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