\\033[0m Starting program." | tee $Log-6ren">
gpt4 book ai didi

shell - 将 ANSI 彩色代码文本发送到 3 个输出 : screen, 文件和文件过滤 ANSI 代码

转载 作者:行者123 更新时间:2023-12-01 06:14:51 30 4
gpt4 key购买 nike

我的程序正在向某个日志文件发送characters-colored文本:

echo -e "\\033[38;5;2m-->\\033[0m Starting program." | tee $LogFile -a

导致日志行颜色完美,但我想同时创建另一个没有 ANSI 代码的日志文件,因为我需要在 Windows 中浏览此日志(我知道有一些 ANSI 浏览器用于Windows,但我更喜欢使用 Total Commander 浏览日志文件,它没有合适的插件。

所以,我的日志行需要三个输出:

  • 一些彩色--> 启动程序。到屏幕
  • 相同颜色的 --> Starting program. line to the logfile with ANSI codes.
  • 相同的未着色 --> Starting program.logfile 的行(我认为没有 ANSI 代码)。

感谢 tee 命令,上面的行很好,它解决了第 1 点和第 2 点,但我不知道如何添加一些选项来保存到另一个文件但没有 ANSI 代码,在至少没有复制整行。也许在 mkfifo 的帮助下使用重定向器、文件描述符?

顺便说一句,我现在的解决方法是重复输出(这变得有点尴尬):

echo -e "\\033[38;5;2m--> Starting program.\\033[0m" | tee $LogFile -a
echo "--> Starting program." >> $NotANSILogFile

最佳答案

要将 ANSI 代码发送到日志文件,ansi.log , 并显示到屏幕上,同时还将非 ANSI 版本发送到名为 nonansi.log 的日志文件,使用:

echo -e "\\033[38;5;2m-->\\033[0m Starting program." | tee -a ansi.log | tee /dev/tty | sed $'s/\E[^m]*m//g' >>nonansi.log

工作原理

  • tee -a ansi.log

    第一个tee命令将 ansi 编码的字符串附加到日志文件 ansi.log .

  • tee /dev/tty

    第二个tee命令将 ansi 编码的字符串发送到屏幕。 (/dev/tty为当前画面的文件名。)

  • sed $'s/\E[^m]*m//g' >>nonansi.log

    最后的命令,sed删除 ansi 序列并将结果附加到 nonansi.log .

    sed命令包含在 bash$'...'字符串,以便转义字符可以简单地表示为 \E .此替换命令查找以 escape, \E 开头的序列, 并以 m 结尾并删除它们。决赛g告诉sed对行中的每个转义序列执行此替换,而不仅仅是第一个。

    如果你有 GNU sed ,另一种方法是使用 GNU 的 \o符号代替:

    sed 's/\o033[^m]*m//g' >>nonansi.log

    如果你没有 GNU sed也不bash , 然后你需要看看你的设施是什么 sed或者您的 shell 提供 Esc 字符。

在shell函数中隐藏细节

如果您需要创建多个日志条目,创建一个 shell 函数可能是最简单的方法,logger , 保存所有杂乱的细节:

logger() { echo -e "$*" | tee -a ansi.log | tee /dev/tty | sed $'s/\E[^m]*m//g' >>nonansi.log; }

定义此函数后,可以通过提供 ansi 编码字符串作为参数来执行任何日志条目:

logger "\\033[38;5;2m-->\\033[0m Start."

关于shell - 将 ANSI 彩色代码文本发送到 3 个输出 : screen, 文件和文件过滤 ANSI 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27464492/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com