显示带有转义颜色代码的文件 - 从bootlog守护程序启动消息

rip*_*pat 11 linux terminal ubuntu debian

我有一个包含颜色代码的文件:

Fri May 25 17:13:04 2012: [....] Starting MTA: exim4^[[?25l^[[?1c^[7^[[1G[^[[32m ok ^[[39;49m^[8^[[?25h^[[?0c.
Fri May 25 17:13:05 2012: [....] Loading cpufreq kernel  modules...^[[?25l^[[?1c^[7^[[1G[^[[32m ok ^[[39;49m^[8^[[?25h^[[?0cdone (acpi-cpufreq).
Run Code Online (Sandbox Code Playgroud)

如何在linux终端上显示它的颜色?

rip*_*pat 13

为了完整起见,包含所有这些转义序列的文件由bootlogd守护程序(debian系列中的bootlog程序包)生成,该守护程序捕获在引导期间发送到控制台的所有彩色消息.在控制台上,这些消息首先显示如下:

[....] Starting periodic command scheduler: cron
Run Code Online (Sandbox Code Playgroud)

然后,当执行服务或命令时,转义序列被发送到控制台以将光标重新定位在行的开头并打印ok,fail,info,warn等...

[ ok ] Starting periodic command scheduler: cron.
Run Code Online (Sandbox Code Playgroud)

所有这些消息都由bootlogd守护程序捕获并写入包含所有转义序列的文件,包括重新定位.没问题,除了^[必须用八进制替换033才能正确显示文件.但是,因为有一个catch,守护进程还会在消息前面添加一个日期戳而不更改游标重新定位序列的坐标.因此,ok,fail等...消息会覆盖日期戳的一部分.不太好.

Fri May 25 17:13:01 2012: [....] Starting periodic command scheduler: cron
becomes...
[ ok ay 25 17:13:01 2012: [....] Starting periodic command scheduler: cron.
Run Code Online (Sandbox Code Playgroud)

解决方案是更改光标定位序列.通过尝试和错误,我发现了序列^[1G.以下sed命令最终完成了工作:

sed 's/\^\[/\o33/g;s/\[1G\[/\[27G\[/' /var/log/boot
Run Code Online (Sandbox Code Playgroud)

bootlogd守护进程发送控制台消息文件前,应清除所有的转义序列.我们可以称之为错误吗?

这个"bug"也可能存在于所有Debian继承人中,如Ubuntu,Mint等......


Gra*_*eme 5

所以里帕特的回答对我不起作用。我在 Debian wiki 上找到了一个替代方案 - https://wiki.debian.org/bootlogd

在撰写本文时,这是:

sed $'s/\^\[/\E/g' /var/log/boot
Run Code Online (Sandbox Code Playgroud)

对于 bootlogd 版本 <2.88(无日期戳)。对于以后的版本:

sed $'s/\^\[/\E/g;s/\[1G\[/\[27G\[/' /var/log/boot
Run Code Online (Sandbox Code Playgroud)

后者完美地格式化了我的日志中除一行之外的所有内容,只有很小的差异。另请注意,正如此问题的错误报告中所指出的,$sed 模式的前导使这些解决方案特定于 bash。


小智 5

您可以使用 bash 内置插件:

$ echo "$(< /your/file)"
Run Code Online (Sandbox Code Playgroud)