Используйте 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 
  • Прокрутите * файлы, используя $ 1 в скрипте bash
  • Как извлечь строки, начинающиеся с определенного письма?
  • Есть ли альтернатива использованию rbash для ограничения пользователя в моей системе?
  • Сценарий оболочки для выполнения сеанса telnet в ser2net
  • Передайте все строки в файле как отдельный аргумент, разделенный пробелом
  • Потенциальные проблемы (если они есть) при рекурсивной замене пробелов символами подчеркивания во всех именах файлов на жестком диске
  • Убедитесь, что только root может редактировать скрипт перед его выполнением
  • как передать смесь аргументов в скрипт и только из них необязательный -аргумент
  • Скрипт для загрузки ЦП отдельных ядер
  • Автоматизация ввода текста из сценария bash без использования EOF
  • Как создать diff для серии файлов?
  • Linux и Unix - лучшая ОС в мире.