Text-Processing
在標準輸出中保留顏色但從 tee 中刪除
我想在控制台的標準輸出中看到顏色輸出,但我想在
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 的同名軟體包中可用,但請注意該算法相當粗糙,請參閱從腳本輸出中刪除控製字元(包括控制台程式碼/顏色)以獲得可能更精細/更緊密的著色過濾器。