Вопрос или проблема
У меня есть скрипт, который отправляет уведомление по электронной почте в группу администраторов системы, когда сервер включается или выключается. В письме содержится дамп некоторых важных журналов, таких как /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 последовательностей и других управляющих символов, которые могут испортить внешний вид текста в отправляемом по электронной почте отчете.
Предлагаю следующий пошаговый подход к решению:
-
Удаление ANSI-escape последовательностей: Эти последовательности обычно начинаются с
ESC
(или символа^[
) и заканчиваются на буквуm
. Их можно предложить удалить с помощью следующей команды:sed -r 's/\x1B\[[0-9;]*m//g' /var/log/boot.log
-
Удаление символов позиционирования курсора: Есть также последовательности, которые заканчиваются на символ
G
. Их можно удалить следующей командой:sed -r 's/\x1B\[[0-9;]*G//g'
-
Удаление оставшихся управляющих символов: На финальном этапе можно удалить любые остальные управляющие символы с помощью следующей команды:
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'
На этом этапе вы сможете отправить очищенный лог своему админу, и он будет выглядеть читабельно без лишних управляющих символов.