我正在尝试获取程序的输出(有颜色)并用tee
输出。我希望输出在终端(stdout)上有颜色,但不在输出文件上。这可能吗?
答案 0 :(得分:3)
一种可能的方法是,在stderr上打印转义字符,& stdout的主要内容。我在其中一个脚本中完成了它。它当然不是一个可扩展的选项。
编写一个专用脚本是一个有趣的练习,该脚本解析stdin,将转义序列放在stderr&其他人在stdout上。 :-)
然后
./myScript.sh | filter_escapes | tee outfile.log
我没有看到任何可以做到这一点的脚本,但我认为,编写一个脚本(如果尚未提供)会很有趣。
就你的问题而言,我认为下面的内容应该足够了:
ls --color=always | sed -r 'w /dev/stderr' | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' > /tmp/test
用./your_script&替换ls --color=always
/tmp/test
包含您想要的输出文件名。
其他实施:
ls --color=always | tee >(sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' > /tmp/abcd)
注意:tee >(sed .... > logfile)
语法
注意:
1.正则表达式从sampson-chen的答案借来
2. sed中/ dev / stderr的w命令是GNU sed的补充。
答案 1 :(得分:0)
是的,这是可能的。通过sed
将要输入的结果传递到输出文件中,以删除格式化颜色时使用的转义字符:
在Linux上:
sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
在OS X上,因为它不是GNU sed:
sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
我最近编写的工具的一部分与您在tee
中描述的完全相同:
https://github.com/sampson-chen/sack/blob/master/sack
ack --color $sack__flags $@ $sack__cwd | tee >$sack__dev_null >(display_shortcuts) >(process_shorcut_paths | remove_escaped_chars > $sack__shortcut_file)
其中函数remove_escaped_chars
包含操作系统版本检查,然后应用sed
脚本,如上所示。
(注1:tee
自动将输出的副本重定向到stdout,因此我使用>$sack__dev_null
来防止这种情况:因为我想在打印到stdout的内容中添加其他信息,如函数display_shortcuts
)
(注2:tee
本身在使用时绝对不会删除颜色格式:我怀疑是其他工具的管道默认行为。)