我想在控制台的标准输出中看到颜色输出,但我想在捕获的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 上的同名软件包中找到,但请注意该算法相当粗糙, 看从脚本输出中删除控制字符(包括控制台代码/颜色)用于可能更精细/更紧密的彩色滤光片。