Отображать файл с экранированными цветовыми кодами - загружать сообщения из демона 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).

Как я могу отобразить его на сервере linux?

Ответ 1

Для полноты, файл, содержащий все эти escape-последовательности, генерируется демоном bootlogd (пакет bootlog в семействе debian), который фиксирует все раскрашенные сообщения, отправленные на консоль во время загрузки. На консоли эти сообщения сначала отображаются, как следующая строка:

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

тогда, когда служба или команда выполняется, escape-последовательность отправляется в консоль, чтобы переместить курсор в начале строки и распечатывает ok, fail, info, warn и т.д.

[ ok ] Starting periodic command scheduler: cron.

Все эти сообщения захватываются демоном bootlogd и записываются в файл со всеми его escape-последовательностями, включая репозиционирование. Нет проблем, кроме того, что ^[ должен быть заменен на восьмеричный 033, чтобы файл был правильно отображен. Но, поскольку есть улов, демон также добавляет отметку даты перед сообщением, не меняя координаты последовательности перестановки курсора. Следовательно, сообщения 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.

Решение состоит в том, чтобы изменить последовательность позиционирования курсора. По попытке и ошибке я обнаружил, что последовательность должна быть ^[1G. Команда sed наконец выполнит задание:

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

Демон bootlogd должен очистить всю escape-последовательность перед отправкой сообщений консоли в файл. Можно ли назвать это ошибкой?

Эта "ошибка" также может присутствовать во всех наследниках Debian, таких как Ubuntu, Mint и т.д.

Ответ 2

Так что ответ ripat не работал у меня. Я нашел альтернативу в вики Debian - 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 конкретными.

Ответ 3

Вы можете использовать встроенные модули bash:

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

Ответ 4

Попробуйте less -R /your/file.

Я обнаружил, что more по умолчанию действительно делает то, что я ожидаю: он показывает раскрашенный текст в терминале. Тот факт, что more работал, а less (он младший двоюродный брат) не заставил меня взглянуть на страницу man less.

Оказывается, что less поддерживает флаг -R, который выводит последовательности ESC в качестве необработанных управляющих символов. Это то же самое поведение, которое вы получаете с помощью more, плюс все усовершенствования для поиска и навигации, которые входят в стандартную комплектацию с less.