У нас был внутренний подрядчик, который помогал с некоторой конфигурацией продукта, и мы пытались просмотреть журналы замазки, которые он настроил для нас, но вместо использования «вывода для печати» он использовал «вывод всех сеансов», который включает все нажатие клавиши, включая «BS» и т. д., делало журналы очень трудными для чтения, поскольку в нем было много-много опечаток. то есть:
[ESC]] 0; root @ host: ~ [BEL] [root @ host ~] # itm, cm [BS] [BS] [ESC] [K [BS] [ESC] [Kcmd агент starp [BS] t
Есть ли какой-нибудь способ разумно вырезать эти управляющие символы, чтобы конечный результат был удобочитаемым файлом, очень похожим на тот, который вы бы видели в формате «вывода для печати»?
Спасибо за предложение ниже. Наша основная проблема - это управляющие символы [BS], которые могут изменить это:
ls -pg [BS] [BS] al P [BS] | greu [BS] p dr
в:
ls -al | grep dr
Есть идеи, как этого добиться?
Включить очень большую прокрутку в шпатлевке, cat
файл журнала, скопируйте и вставьте результат в новый файл.
Этот фильтр sed, хотя и не идеален, даст вам отправную точку.
sed -r 's/(\[[A-Z]+\]?|\]0;)//g' escapes.log > noescapes.log
Если я пропущу ваш образец через этот фильтр, я получу:
root@host:~[root@host ~]# itm,cmcmd agent starpt
Решение, которое полагается на команду / сценарий для анализа фактических кодов терминала, было бы более элегантным, это скорее «быстрое исправление».
Разбор регулярных выражений для тех, кто пытается их изучить:
|
символ ИЛИ)\[
и \]
- это экранированные квадратные скобки, поэтому они не будут интерпретироваться как класс символов.[
]
содержат класс символов. [A-Z]
это класс для сопоставления любой заглавной буквы.+
указывает на соответствие «одному или нескольким предыдущим атомам». Предыдущий атом был классом символов, так что «одна или несколько заглавных букв».?
указывает, что предыдущий атом необязателен. В этом случае необязательный атом \]
.|
символ - начало ИЛИ.\]0;
соответствует 'литералу] с суффиксом 0; `.Строка замены пуста, поэтому они удаляются. /g
говорит sed
не останавливаться на первом матче.