13

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

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

4 回答 4

14

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

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

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

[ ok ] Starting periodic command scheduler: cron.

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

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守护程序应在将控制台消息发送到文件之前清除所有转义序列。我们可以称之为错误吗?

这个“错误”也可能存在于所有 Debian 继承者中,如 Ubuntu、Mint 等......

于 2012-05-26T06:52:57.767 回答
5

您可以使用 bash 内置函数:

$ echo "$(< /your/file)"
于 2015-04-29T09:50:38.003 回答
5

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

于 2013-09-25T17:09:34.307 回答
4

试试less -R /your/file

我发现more默认情况下它确实符合我的预期:它在终端中显示彩色文本。有效的事实more,虽然less(它是年轻的表弟)并没有让我看man less页面。

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

于 2017-03-21T14:31:56.630 回答