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

时间:2012-05-25 16:06:28

标签: linux ubuntu terminal 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).

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

4 个答案:

答案 0 :(得分:13)

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

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

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

[ ok ] Starting periodic command scheduler: cron.

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

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”也可能存在于所有Debian继承人中,如Ubuntu,Mint等......

答案 1 :(得分:4)

所以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

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

答案 2 :(得分:2)

您可以使用bash内置函数:

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

答案 3 :(得分:1)

尝试less -R /your/file

我发现默认情况下more实际上是我所期望的:它在终端中显示彩色文本。 more工作的事实虽然less(它的表弟更年轻)没有让我看到man less页面。

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