[Mac/Linux] 讓 grep 用不同顏色標示出不同的重點部分

[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 這個字標註成綠色了~

 

完成後的結果如下: 

Screen Shot 2016-01-15 at 12.44.30 PM  

 

注意環境變數 GREP_COLOR 在新版的 grep/egrep 要改用 GREP_COLORS 喔~

 

參考資料:

stackoverflow: Grep output with multiple Colors?

superuser: What does the grep switch –color=auto do?

egrep(1) – Linux man page

(本頁面已被瀏覽過 5,796 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料