Используйте sed для выбора потенциально многострочной записи журнала

Я пытался придумать команду sed чтобы выбрать одну запись журнала из наших журналов сервера приложений.

Журналы находятся в таком формате:

 LOG|2016-07-26_15:37:45:536|entry1|! LOG|2016-07-26_15:37:45:536|entry2|extra data on new line|! LOG|2016-07-26_15:37:45:536|entry3|! LOG|2016-07-26_15:37:45:536|entry4|! LOG|2016-07-26_15:37:45:536|entry5|! 

Как вы можете видеть, некоторые записи будут только одной строкой, а некоторые из них будут содержать несколько строк, содержащих дополнительные данные. Запись всегда начинается с типа журнала (упрощена до «LOG» выше) и всегда заканчивается |!

Теперь это то, что у меня есть до сих пор:

 sed -n -e '/'$id'/,/|!/ p' 

Это хорошо работает для многострочных записей журнала:

 $ cat log | sed -n -e '/entry2/,/|!/ p' LOG|2016-07-26_15:37:45:536|entry2|extra data on new line|! 

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

 $ cat log | sed -n -e '/entry3/,/|!/ p' LOG|2016-07-26_15:37:45:536|entry3|! LOG|2016-07-26_15:37:45:536|entry4|! 

Любые идеи о том, как я могу изменить свое приложение выше, чтобы охватить как одно-, так и многострочные записи журнала?

2 Solutions collect form web for “Используйте sed для выбора потенциально многострочной записи журнала”

Вам необходимо обрабатывать случаи отдельно, например:

 sed -n '/entry3.*[^!]$/, /|!/p; /entry3.*!/p ' log 

Если строка совпадает с идентификатором и заканчивается восклицательным знаком, она будет напечатана. Если строка совпадает с идентификатором и не заканчивается восклицательным знаком, она знаменует начало диапазона адресов.

Другим способом может быть цикл совпадающей строки до конца ввода:

 sed '/entry3|/{:a;/!$/!{n;ba;};p;};d' log 
  • Быстрый скрипт awk для получения подстроки / строки, которую мы хотели
  • Создание дерева процессов
  • объединение n числа файлов с командой cat
  • Использование настраиваемого фильтра через скрипт для отклонения входящей электронной почты
  • Как подождать подпроцесс, используемый для перенаправления ввода-вывода?
  • Использование rename для удаления '.orig' из файла и добавления '_1' в basename
  • Как я могу вызвать событие в сценарии оболочки при удалении USB-устройства?
  • Сценарий для отображения только файлов типа ASCII в текущем каталоге?
  • Разбор XML с использованием xmllint и настройка вывода
  • Получить PID хост-скрипта в bash
  • Общие обозначения и стандарты флагов для сценариев и функций оболочки
  • Получать уведомления от avahi
  • Linux и Unix - лучшая ОС в мире.