Grep

按顏色過濾命令輸出

  • February 22, 2019

我正在執行一個不提供過濾其輸出的方法的實用程序。輸出文本中沒有任何內容表明特定功能失敗,但它確實顯示為紅色。輸出是如此之長,以至於最後當它報告一些錯誤時,我不能總是滾動查看發生錯誤的輸出。

如何過濾掉非紅色文本?

虛擬碼:

dolongtask | grep -color red

編輯

該命令也輸出其他顏色,我需要能夠過濾所有不是紅色的文本。文本著色也是多行的。

通過嵌入在文本中的轉義序列來切換顏色。程序總是發出ANSI 轉義序列,因為現在幾乎所有終端都支持。

將前景色切換為紅色的轉義序列是\e[31m,其中\e指定一個轉義字元(八進制 033、十六進制 1b,也稱為 ESC,^[以及各種其他名稱)。30-39 範圍內的數字設置前景色;其他數字設置不同的屬性。\e[0m將所有屬性重置為其預設值。執行cat -v以檢查程序列印的內容,它可能會使用一些變體,例如\e[0;31m首先重置所有屬性,或者\e[3;31也打開斜體(許多終端不支持)。

在 ksh、bash 或 zsh 中,您可以使用$'…'在引號內啟用反斜杠轉義,這使您可以鍵入$'\e'以獲取轉義字元。請注意,您必須將要傳遞給的任何反斜杠加倍grep。在/bin/sh中,您可以使用"$(printf \\e)"或鍵入文字轉義字元。

使用 GNUgrep -o選項,以下程式碼片段過濾紅色文本,假設它以轉義序列開頭\e[31m,以任一\e[0m\e[30m在同一行結束,並且不包含嵌入的轉義序列。

grep -Eo $'\e\\[31m[^\e]*\e\\[[03]?m'

以下awk程式碼段提取紅色文本,即使它是多行的。

awk -v RS='\033' '
   match($0, /^\[[0-9;]*m/) {
       color = ";" substr($0, 2, RLENGTH-2) ";";
       $0 = substr($0, RLENGTH+1);
       gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
       red = (color ~ /1;*$/)
   }
   red'

這是保留顏色更改命令的變體,如果您過濾多種顏色(此處為紅色和洋紅色),這可能很有用。

awk -v RS='\033' '
   match($0, /^\[[0-9;]*m/) {
       color = ";" substr($0, 2, RLENGTH-2) ";";
       printf "\033%s", substr($0, 1, RLENGTH);
       $0 = substr($0, RLENGTH+1);
       gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
       desired = (color ~ /[15];*$/)
   }
   desired'

引用自:https://unix.stackexchange.com/questions/134763