what’s grep
grep (globally search a regular expression and print,以正則表達式進行全域尋找以及列印
)是一種強大的文本搜索工具,在給出文件列表或標準輸入後,grep會對匹配一個或多個正則表達式的文本進行搜索,並只輸出匹配的行或文本。十分靈活和強大
前言
grep的強大,在於他與其他命令一起的連用,從簡單到複雜,拼接功能實現強大的邏輯
例如這麼一個功能,需要各種神方法從服務器搜索日誌:
查找包含指定關鍵字的文件的文件名
(包含某一錯誤信息的日誌文件名,一般帶有日期)查找包含指定關鍵字的文件的行
(包含某一錯誤信息的行,一般帶有行號或者錯誤位置或者日期等其他信息)輸出包含指定關鍵字每天出現的次數
(假設日誌錯誤行包含有日期或者日誌文件名包含日期)從固定格式的文件中輸出指定行內容
(適用於報文/批量等固定格式的文件)輸出到日誌文件
(控制檯不便於copy和整理)
需要
- 先
cd
切換到日誌文件的目錄 - Windows可以用 git bash 或者 裝個cmder(推薦) ,Linux下直接使用
原生Shell
即可 - 輸出的
日誌文件
會影響到查找的內容,主要不要輸出在當前文件夾,或者輸出後處理掉,避免影響結果(因爲在同個目錄下) - 正則表達式記不住沒關係,從 https://tool.oschina.net/regex 找即可
可能會一起用到的命令
- cat
- awk
- sed
實戰
以下命令省略後面的>error500-x.txt
輸出到文件的指令,需要請自行在尾部添加.
- 查找包含500錯誤的行內容並輸出到error500.txt
grep -rn "HTTP protocol error 500 (Internal Server Error)"
控制檯輸出包含指定關鍵字的行
ServerLog_2020_01_07_08_02_39.log:685: 2020-01-07 08:02:42 0061 'protocol error 500 (Internal Server Error): 3rd System API '
- 查找包含500錯誤的日期,-oE後面加正則表達式用於提取日期
grep -rn "HTTP protocol error 500 (Internal Server Error)" | grep -oE "([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))"
控制檯輸出
- 查找包含500錯誤的日期並進行分組統計,
awk "{s[$1]+=1}END{ for(i in s){ print i, s[i] } }"
中的+=1
代表遇到1個就累計加一,但那時有些情況需要累計加0.5
,例如一行出現兩個日期等等,根據實際情況修改
grep -rn "HTTP protocol error 500 (Internal Server Error)" | grep -oE "([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][ 0-9]|2[0-8])))" | Sort | awk "{s[$1]++}END{ for(i in s){ print i, s[i] } }"
控制檯輸出
- 輸出固定行內容,
470,470p
代表輸出第470行,470,480p
代表輸出470~480行.
sed -n '470,470p' SeverLog_2020_01_08_08_19_40.log
控制檯輸出
020-01-08 08:19:40 0169 Environment=PROD,v_user_id=zhengkai2020upupup
附錄:grep命令參數大全
-a
或 --text : 不要忽略二進制的數據。-A
<顯示行數> 或 --after-context=<顯示行數> : 除了顯示符合範本樣式的那一列之外,並顯示該行之後的內容。-b
或 --byte-offset : 在顯示符合樣式的那一行之前,標示出該行第一個字符的編號。-B
<顯示行數> 或 --before-context=<顯示行數> : 除了顯示符合樣式的那一行之外,並顯示該行之前的內容。-c
或 --count : 計算符合樣式的列數。-C
<顯示行數> 或 --context=<顯示行數>或-<顯示行數> : 除了顯示符合樣式的那一行之外,並顯示該行之前後的內容。-d
<動作> 或 --directories=<動作> : 當指定要查找的是目錄而非文件時,必須使用這項參數,否則grep指令將回報信息並停止動作。-e
<範本樣式> 或 --regexp=<範本樣式> : 指定字符串做爲查找文件內容的樣式。-E
或 --extended-regexp : 將樣式爲延伸的正則表達式來使用。-f
<規則文件> 或 --file=<規則文件> : 指定規則文件,其內容含有一個或多個規則樣式,讓grep查找符合規則條件的文件內容,格式爲每行一個規則樣式。-F
或 --fixed-regexp : 將樣式視爲固定字符串的列表。-G
或 --basic-regexp : 將樣式視爲普通的表示法來使用。-h
或 --no-filename : 在顯示符合樣式的那一行之前,不標示該行所屬的文件名稱。-H
或 --with-filename : 在顯示符合樣式的那一行之前,表示該行所屬的文件名稱。-i
或 --ignore-case : 忽略字符大小寫的差別。-l
或 --file-with-matches : 列出文件內容符合指定的樣式的文件名稱。-L
或 --files-without-match : 列出文件內容不符合指定的樣式的文件名稱。-n
或 --line-number : 在顯示符合樣式的那一行之前,標示出該行的列數編號。-o
或 --only-matching : 只顯示匹配PATTERN 部分。-q
或 --quiet或–silent : 不顯示任何信息。-r
或 --recursive : 此參數的效果和指定"-d recurse"參數相同。-s
或 --no-messages : 不顯示錯誤信息。-v
或 --revert-match : 顯示不包含匹配文本的所有行。-V
或 --version : 顯示版本信息。-w
或 --word-regexp : 只顯示全字符合的列。-x
--line-regexp : 只顯示全列符合的列。-y
: 此參數的效果和指定"-i"參數相同。