将颜色保留在标准输出中,但从 T 恤中删除

将颜色保留在标准输出中,但从 T 恤中删除

我想在控制台的标准输出中看到颜色输出,但我想在捕获的tee命令输出副本中将其删除。就我而言,

将颜色写入到标准输出的命令|球座文件

我希望文件中不含 ANSI 颜色序列等,因为这样grep以后日志文件会变得有趣:

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

在这种情况下,颜色会写入控制台并写入文件“test.log”。

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

有没有办法只为 的tee输出去除 ANSI 序列到文件?

试图让 tee 看到我的终端不知道颜色(环境变量、子 shell),但tee很高兴只写了它所给出的内容。我想要控制台输出的颜色(对于人类消费来说,这很棒),但不想要输出的日志文件副本中的颜色。

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

我发现很多人在“piped to tee”输出中使用颜色代码(通常当第一个程序知道某些东西能够显示颜色时),但我没有找到可以执行相反操作的问题/答案。

答案1

如果您使用的是 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不会这样做。

答案2

zsh, 和ansi2txt来自彩色原木1:

将颜色写入到标准输出的命令>&1 > >(ansi2txt >文件

当 fd 多次重定向以进行写入时,zsh 确实实现了类似 tee 的行为。


¹ 它可以在 Debian/Ubuntu 上的同名软件包中找到,但请注意该算法相当粗糙, 看从脚本输出中删除控制字符(包括控制台代码/颜色)用于可能更精细/更紧密的彩色滤光片。

相关内容