Text-Processing

在標準輸出中保留顏色但從 tee 中刪除

  • March 18, 2022

我想在控制台的標準輸出中看到顏色輸出,但我想在tee命令輸出的擷取副本中將其刪除。就我而言,

*command_that_writes_color_to_stdout* | 三通*文件*

我希望文件中沒有 ANSI 顏色序列等,因為它使grep以後的日誌文件變得有趣:

echo -e "color \033[1;31mRED\033[0m output" | tee test.log

在這種情況下,顏色被寫入控制台並寫入文件“test.log”。

color ^[[1;31mRED^[[0m output

有沒有辦法只為tee文件的輸出去除 ANSI 序列?

試圖讓 tee 看到我的終端不知道顏色(環境變數、子外殼),但很tee高興只寫它給出的內容。我想要控制台輸出的顏色(供人類消費,這很棒),但不希望輸出的日誌文件副本中的顏色。

echo -e "color \033[1;31mRED\033[0m output" | TERM=dumb tee test.log ; od -c test.log

我發現很多人想要在他們的“piped to tee”輸出中使用顏色程式碼(通常是當第一個程序知道可以顯示顏色的東西時),但我沒有找到相反的問題/答案。

如果您使用的是 bash,則可以刪除所有顏色(圖形再現)

echo -e "color \033[1;31mRED\033[0m output" | tee >(sed $'s/\033[[][^A-Za-z]*m//g' > test.log)

所有ANSI 轉義序列

echo -e "color \033[1;31mRED\033[0m output" | tee >(sed $'s/\033[[][^A-Za-z]*[A-Za-z]//g' > test.log)

(我已經對此進行了測試,但並不詳盡。)

PS 如果要附加到日誌文件,>> test.log請在括號內使用;tee -a不會的。

使用zsh, 和ansi2txt來自colorized-logs ¹:

*command_that_writes_color_to_stdout* >&1 > >(ansi2txt >*文件*)

當 fd 被多次重定向以進行寫入時,zsh 確實實現了類似 tee 的行為。


¹ 它在 Debian/Ubuntu 的同名軟體包中可用,但請注意該算法相當粗糙,請參閱從腳本輸出中刪除控製字元(包括控制台程式碼/顏色)以獲得可能更精細/更緊密的著色過濾器。

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