「是否還在用眼睛追蹤數萬行的日誌?」
「面對突發的故障調查,是否曾感到不知從何下手的焦慌?」
「是否需要一個個打開專案來尋找關鍵字?」
每位新進現場的工作者,皆曾經歷這樣令人沮喪的「調查泥沼」。其實,只要對 grep 命令有更深入的了解,就能從這些煩惱中解放出來。
本文將介紹 grep 的選項,並聚焦於現場實際上非常有用的運用方式,特別是「正規表達式」以及與 find 等其他命令的「搭配技術」。
讀完本文後,您將成為可以用一條命令輕鬆結束繁瑣調查工作「搜尋達人」。
grep 基本且最強大的選項!# -i: 忽略大小寫搜索
$ grep -i "error" server.log
# -n: 顯示匹配行的行號
$ grep -n "Exception" app.log
# -A 3: 顯示匹配行之後的3行
$ grep -A 3 "Exception" app.log
## 若想獲取匹配行之前的內容使用 -B
## 若想獲取匹配行的前後內容使用 -C
# -v: 提取不包含指定字符串的行
$ grep -v "DEBUG" system.log
# -r: 以遞迴的方式搜索目錄下的內容(超重要!)
$ grep -r "function_name" ./src
# -c: 計算匹配的行數
$ grep -c "WARNING" access.log
# -a: 對於二進位文件進行搜索
grep -a "hogehoge" aplocation.dat
grep 能力的關鍵在於「正規表達式」^: 行首
$: 行尾
.: 任意一字符
*: 直前字符的零次或多次重複
[]: 方括號內的任意字符  
想做的事情: 從日誌中提取 IP 地址(類似的字符串)。
# 這樣只能找到 "127.0.0.1" ...
$ grep "127.0.0.1" access.log
# 使用 egrep (或 grep -E) 以擴展正規表達式進行智慧搜索
$ egrep "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" access.log
grep 命令本身就已經相當強大,但與其他命令結合後能發揮其真正價值!・find × grep: 僅從特定模式的文件中(例如:.log 擴展名)高速搜索
# 從當前目錄下的 .log 文件中搜索 "FATAL"
find . -name "*.log" | xargs grep "FATAL"
・ 管道 | 的運用: 進一步用 grep 獲取 grep 的結果(與 grep -v 組合使用時超強大)
# 從 user_id: 123 的日誌中排除 "DEBUG" 級別的日誌顯示
grep "user_id: 123" application.log | grep -v "DEBUG"
<iframe id="qiita-embed-contenta38b4046ce6d83e2327a00c7def8f812"></iframe>
<iframe id="qiita-embed-content0b6496a7217342d0c04d9b7021787d88"></iframe>
原文出處:https://qiita.com/TonitolCalsis/items/e71715c578c09c2ac960