[Mac/Linux] 讓 grep 用不同顏色標示出不同的重點部分
我常常在記錄檔裡面找一些錯誤訊息,一般來說 grep/egrep 會用紅色來表示,
但有時我又希望用另外一種顏色來標註其他的資訊 (像是 IP address),
這個時候要怎麼辦呢?
查了一下,原來 egrep 的 –color 參數是有些玄機的,它有三種參數:
– 平常只寫 –color 的話代表的是 –color=auto,顯示在 terminal 上時加顏色 (加上 ANSI 顏色碼),否則若是 pipe 到其他 process/file 時就不加顏色
– 另一種是 –color=never 表示不要標註顏色
– 另一種是 –color=always 表示不管現在是顯示在哪裡,都要加上顏色
假設我們現在想要將 /tmp/messages 的內容顯示在 terminal 上,
但是每行 log 的開頭時間要標註成紅色,systemd 這個字要標註成綠色的話,
就可以像下面這樣寫:
head /tmp/messages | egrep --color=always "^\S+|$" | GREP_COLOR="1;32" egrep --color "systemd|$"
上面這行的意思,是用 head 取出 /tmp/messages 的前幾行 (舉例用),
接著用 egrep –color=always 強制輸入顏色 ANSI 碼 (預設是紅色),
^\S+|$ 代表的是要比對開頭非空白的字元、或者是結尾,
所以如果開頭有非空白字元的話,就會被標註成紅色,
接著將輸出 pipe 給下一個 egrep 指令,
所以第二個 egrep 還會接收到第一個 egrep 產生出來的顏色 ANSI 碼~
第二個 egrep 就只用 –color (也就是 –color=auto),所以輸出至 terminal 時會保留顏色 ANSI 碼,
但這次的 egrep 會用環境變數的 GREP_COLOR 中定義的顏色碼來標註,
因此就會把 systemd 這個字標註成綠色了~
完成後的結果如下:
注意環境變數 GREP_COLOR 在新版的 grep/egrep 要改用 GREP_COLORS 喔~
參考資料:
stackoverflow: Grep output with multiple Colors?
superuser: What does the grep switch –color=auto do?