显示具有转义颜色代码的文件 – 从bootlog守护进程启动消息

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

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). 

我怎样才能显示它着色在Linuxterminal上?

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

 [....] Starting periodic command scheduler: cron 

然后,当服务或命令执行时,转义序列被发送到控制台重新定位在行的开始处的光标,并打印好,失败,信息,警告等…

 [ ok ] Starting periodic command scheduler: cron. 

所有这些消息都被bootlogd守护进程捕获,并写入一个包含重定位转义序列的所有转义序列的文件。 除了^[必须被八进制033代替以正确显示文件之外没有任何问题。 但是,由于存在捕获,守护进程还在消息前添加日期戳,而不更改游标重新定位序列的坐标。 因此, 好的失败等消息覆盖部分日期戳记。 不太好。

 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. 

解决办法是改变光标定位顺序。 通过尝试和错误,我发现序列是^[1G 。 下面的sed命令终于完成了这项工作:

 sed 's/\^\[/\o33/g;s/\[1G\[/\[27G\[/' /var/log/boot 

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

这个“bug”也可能出现在Ubuntu,Mint等所有Debian继承人中。

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

在撰写本文时,这是:

 sed $'s/\^\[/\E/g' /var/log/boot 

对于bootlogd版本<2.88(无日期戳)。 对于更高版本:

 sed $'s/\^\[/\E/g;s/\[1G\[/\[27G\[/' /var/log/boot 

后者完全格式化我的日志中的所有行,只有一个小的差异。 还要注意的是,正如在这个问题的bug报告中指出的那样,sed模式中的前导$使得这些解决方案是特定的。

你可以使用bash内建插件:

 $ echo "$(< /your/file)" 

尽量less -R /your/file

我发现, more的默认实际上是我所期望的:它显示终端中的彩色文字。 事实上, more工作,而less (这是年轻的表弟)没有让我看看man less页。

事实证明, less支持-R标志,它将ESC序列输出为原始控制字符。 这与您获得more行为相同,再加上所有标准的搜索和导航增强功能。