Grep
按顏色過濾命令輸出
我正在執行一個不提供過濾其輸出的方法的實用程序。輸出文本中沒有任何內容表明特定功能失敗,但它確實顯示為紅色。輸出是如此之長,以至於最後當它報告一些錯誤時,我不能總是滾動查看發生錯誤的輸出。
如何過濾掉非紅色文本?
虛擬碼:
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)"
或鍵入文字轉義字元。使用 GNU
grep -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'