【问题标题】:Preserve color when outputting with tee [closed]使用 tee 输出时保留颜色 [关闭]
【发布时间】:2012-11-06 16:50:17
【问题描述】:

我正在尝试获取程序的输出(具有颜色)并使用tee 输出它。我希望输出在终端(stdout)上有颜色,但在输出文件上没有。这可能吗?

【问题讨论】:

  • 你在运行什么程序?
  • 这是我写的脚本(真的很长);我只想tee 它输出到文件和屏幕,但屏幕上有颜色。
  • 如何在脚本中打印颜色?
  • 这个问题必须有答案,因此它是一个真实的问题。
  • 这个链接是答案superuser.com/a/751809/163119,为什么人们认为这不是一个真正的问题?

标签: bash


【解决方案1】:

一种可能的方法是,在 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

ls --color=always 替换为 ./your_script 和 /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 的补充。

【讨论】:

  • 当您投反对票时,请发表评论...
  • 呃……我不记得投反对票了。对不起。也许那天我脾气暴躁。现在我似乎无法撤消它。
  • 没关系...我认为解决方案中有一些错误,或者我在暗示不好的编码习惯。因此,当有人对问题/答案投反对票时,出于改进原因,系统会要求您发表评论。
【解决方案2】:

是的,这是可能的。通过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 自动将输出的副本重定向到标准输出,所以我使用>$sack__dev_null 来防止这种情况:因为我想向打印到标准输出的内容添加附加信息,如函数display_shortcuts 中所定义的那样)

(注 2:tee 本身在我使用它时绝对不会删除颜色格式:我怀疑是其他工具对管道的默认行为。)

【讨论】:

  • 感谢您的回复;目前,我得到的与您的想法相反。我正在打印 with 颜色,但tee 正在从标准输出和输出文件中删除它们。换句话说,我正在尝试与您建议的相反(输出文件看起来不错;它的标准输出没有按照我想要的方式运行)
  • @pap42 您在脚本中使用了哪些工具来生成颜色格式?例如,grep 之类的工具在用作管道的一部分时会默认关闭颜色格式(您可以通过使用 grep 来查找某些内容,然后将其通过管道传输到另一个 grep 来测试它)。要通过管道保留颜色格式,您必须查看这些工具是否有一些选项可以这样做(例如grep--color=always 选项)。 tee 本身在我使用它时绝对不会删除颜色格式:我怀疑是其他工具对管道的默认行为。
  • 实际上,我直接用tee 输出带有颜色的东西。进入标准输出的东西没有颜色......
猜你喜欢
  • 1970-01-01
  • 2017-01-07
  • 2013-09-20
  • 1970-01-01
  • 2012-03-31
  • 2013-07-03
  • 2015-11-05
  • 2020-03-20
  • 1970-01-01
相关资源
最近更新 更多