Unix/Linux 的 grep 指令使用
grep (global regular expression print) 的用途是找到符合 regex 的文字,是初學者比較容易搞混的指令,因為太多範例都是搭配管道符使用,其實他的語法是這樣:
SYNOPSIS
grep [OPTION]... PATTERNS [FILE]...
grep [OPTION]... -e PATTERNS ... [FILE]...
grep [OPTION]... -f PATTERN_FILE ... [FILE]...
如果不提供 -e
或者 -f
參數,第一個參數 PATTERNS
將會被視為以換行符號分隔的多個 pattern。grep 使用有兩個注意事項:
- ripgrep 不只比內建的 grep 還快 而且更直觀好用,但還是要學他,因為運行腳本的環境通常不會有 rg 這種東西
- macOS 內建 grep 版本很舊,請用 brew 安裝 gnu 新版取代
常用參數
--include
--exclude
--exclude-dir
: 尋找/排除哪些檔案,後面加上 GLOB 語法-E
/-P
: 使用 Extend (ERE) / Perl (PCRE) 版本的 regex,PCRE 是最強的,支援 lookahead/lookbehind/lazy 語法-e
: 設定 pattern,只有一個的話不需指定,有多個 pattern 可以使用多個-e
-v
: 反向匹配-w
: 匹配整個文字相符-i, --ignore-case
/--no-ignore-case
: 是否忽略大小寫-n
: 顯示行數-r
: 遞迴搜尋-l
: 只印檔名-c
: 只印檔名和行數-H, --with-filename
-h, --no-filename
: 是否顯示檔案名稱-A
/-B
/-C
: 輸出三兄弟,設定印出之後 (A)fter 之前 (B)efore 前後 (C)ontext 幾行的文字,參數後面加上數字使用
身為一個正常人類,我強烈建議你直接把在 bashrc
/ zshrc
裡面設定 alias grep='grep --color=auto'
,沒有顏色眼睛會先瞎掉。
常用範例
先從基礎說起,雖然幾乎很少這樣用,但是不可能不學會基礎用法吧。
找到 #
的行
grep -n '#' README.md
找到包含圖片的行
我之前在清理 repo 就用到此指令
grep -iEHnr '\.(jpg|jpeg|png|gif)' --include='*.md' --exclude-dir={.git,cache,node_modules} --color=auto .
搭配 VS Code 神之方便,command + 左鍵按下就會直接跳到該檔案的該行。如果要搭配腳本執行,可以把 H 改為 h 就可以直接操作該行。
在指定檔案中找 pattern
雖然 grep 支援 GLOB 過濾檔案,但是複雜規則還是交給 find。
find /path/to/dir -type f -exec grep -H "pattern" {} \;
查看你的部落格寫了多少標題
grep '^#+' -rnE --include='*.md' --exclude-dir={.git,node_modules,cache} -H --color=auto | wc -l
^
限制從頭開始,+
匹配至少一個 #
,wc -l
統計行數,附帶一提本文檔庫已經有 1688 個標題了。
解析日誌
找到 error 的行
tail -n 100 /var/log/syslog | grep -i "error"