Удалить управляющие символы из /var/log/boot.log

Вопрос или проблема

У меня есть скрипт, который отправляет уведомление по электронной почте в группу администраторов системы, когда сервер включается или выключается. В письме содержится дамп некоторых важных журналов, таких как /var/log/messages, /var/log/secure, /var/log/boot.log. Файл /var/log/boot.log содержит некоторые специальные символы, которые при отправке по электронной почте выглядят искаженно, так как в нем есть специальные управляющие символы для форматирования и табуляции. Как мне удалить эти специальные символы, чтобы сделать вывод читаемым?

Я знаю, что могу использовать sed для удаления символов, но я ищу простой и элегантный способ.

(Файл /var/log/boot.log взят из CentOS 6.x)

Вот дамп моего /var/log/boot.log:

[root@vagrant ~]# cat -v /var/log/boot.log 
^[%G            Добро пожаловать в ^[[0;36mCentOS^[[0;39m ^M
Запускаем udev: ^[%G^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Устанавливаем имя хоста vagrant:  ^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Настраиваем управление логическими томами:   5 логических томов в группе томов "vgdynamic" теперь активны^M
  3 логических тома в группе томов "vgstatic" теперь активны^M
^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Проверка файловых систем^M
/dev/mapper/vgstatic-lvroot: чистая, 8102/884736 файлов, 175959/3537920 блоков^M
/dev/sda1: чистая, 44/32768 файлов, 17226/131072 блоков^M
/dev/mapper/vgdynamic-lvhome: чистая, 10280/196608 файлов, 74141/786432 блоков^M
/dev/mapper/vgdynamic-lvopt: чистая, 932/655360 файлов, 104046/2620416 блоков^M
/dev/mapper/vgstatic-lvtmp: чистая, 12/131072 файлов, 25386/524288 блоков^M
/dev/mapper/vgstatic-lvusr: чистая, 41785/262144 файлов, 236524/1048576 блоков^M
/dev/mapper/vgdynamic-lvvar: чистая, 1989/393216 файлов, 93057/1572864 блоков^M
/dev/mapper/vgdynamic-lvvarlog: чистая, 55/49152 файлов, 8030/196608 блоков^M
/dev/mapper/vgdynamic-lvaudit: чистая, 14/65536 файлов, 73366/262144 блоков^M
^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Перемонтируем корневую файловую систему в режим чтения-записи:  ^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Монтируем локальные файловые системы:  ^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Включаем обмен в /etc/fstab:  ^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Переход в неинтерактивный режим загрузки^M
Запускаем сборщик данных системной активности (sadc)... ^M
Запускаем мониторинг для VG vgdynamic:   5 логических томов в группе томов "vgdynamic" под наблюдением^M
^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Запускаем мониторинг для VG vgstatic:   3 логических тома в группе томов "vgstatic" под наблюдением^M
^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Включаем интерфейс обратной связи:  ^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Включаем интерфейс eth0:  ^M
Определяем IP информацию для eth0... готово.^M
^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Запускаем auditd: ^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Запускаем системный журнал: ^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Запускаем lwsmd: ^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Монтируем файловые системы:  ^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Сбрасываем неудачные события udev^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Запускаем дополнения VirtualBox ^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Запускаем службу дополнений VirtualBox ^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Запускаем sshd: ^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Запускаем ntpd: ^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Запускаем crond: ^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
Запускаем atd: ^[[60G[^[[0;32m  ОК  ^[[0;39m]^M^M
[root@vagrant ~]# 

Вам следует начинать с более сложных (длинных) шаблонов. Если начинать только с управляющих символов, оставшиеся могут совпадать с шаблонами в обычном тексте. Если скорость не является самой главной задачей, разбейте обработку на несколько команд, так будет проще отладить и легче контролировать порядок удаления.

Секвенции окраски, начинающиеся с ^[ и заканчивающиеся на m. Вы можете удалить их с помощью sed

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?m//g"

Другие шаблоны начинаются с ^[ и заканчиваются на G (позиция курсора):

sed -r "s/\x1B\[.*G//g"

Любые оставшиеся управляющие символы можно удалить следующим образом:

sed 's/[[:cntrl:]]//g' 

С объединенными командами:

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?m//g" /var/log/boot.log | \
   sed -r "s/\x1B\[.*G//g" | \
   sed 's/[[:cntrl:]]//g'

¹ Является ли это элегантным или нет, зависит от точки зрения.

Возможно, команда dos2unix — это то, что вам нужно.

На самом деле я модифицировал предложение Антона и придумал более короткий и надежный regex sed (по крайней мере, для моего файла загрузочного журнала Ubuntu):

sed -r 's/\x1B\[[0-9;]*[a-zA-Z]//g' /var/log/boot.log

Ответ или решение

Для того чтобы удалить управляющие символы из файла /var/log/boot.log, можно воспользоваться утилитой sed, которая позволяет эффективно обрабатывать текстовые данные в строковом формате. В вашем случае, задача сводится к удалению цветовых ANSI-escape последовательностей и других управляющих символов, которые могут испортить внешний вид текста в отправляемом по электронной почте отчете.

Предлагаю следующий пошаговый подход к решению:

  1. Удаление ANSI-escape последовательностей: Эти последовательности обычно начинаются с ESC (или символа ^[) и заканчиваются на букву m. Их можно предложить удалить с помощью следующей команды:

    sed -r 's/\x1B\[[0-9;]*m//g' /var/log/boot.log
  2. Удаление символов позиционирования курсора: Есть также последовательности, которые заканчиваются на символ G. Их можно удалить следующей командой:

    sed -r 's/\x1B\[[0-9;]*G//g'
  3. Удаление оставшихся управляющих символов: На финальном этапе можно удалить любые остальные управляющие символы с помощью следующей команды:

    sed 's/[[:cntrl:]]//g'

Скомбинировав эти команды в одну, можно получить окончательную команду для удаления всех нежелательных символов из файла boot.log:

sed -r 's/\x1B\[[0-9;]*m//g; s/\x1B\[[0-9;]*G//g; s/[[:cntrl:]]//g' /var/log/boot.log

Эта команда сначала удаляет ANSI-цветовые последовательности, затем убирает позиционирование курсора и, наконец, удаляет все остальные управляющие символы.

Для удобства, если вам нужно сохранять вывод в новый файл, вы можете перенаправить вывод в файл следующим образом:

sed -r 's/\x1B\[[0-9;]*m//g; s/\x1B\[[0-9;]*G//g; s/[[:cntrl:]]//g' /var/log/boot.log > /path/to/cleaned_boot.log

Где /path/to/cleaned_boot.log – это путь к файлу, куда вы хотите сохранить очищенный лог.

cat -v /var/log/boot.log | sed -r 's/\x1B\[[0-9;]*[a-zA-Z]//g'

На этом этапе вы сможете отправить очищенный лог своему админу, и он будет выглядеть читабельно без лишних управляющих символов.

Оцените материал
Добавить комментарий

Капча загружается...