Извлечение с помощью grep / sed первого шаблона, а затем второго шаблона, который имел некоторые строки до и связанные с первым

Я пытаюсь извлечь определенную строку из файла .htm когда происходит шаблон («Событие 100» в моем примере ниже), но в то же время мне нужно получить еще один шаблон, который связан с первым, но который возникает из одна из линий над ней. Этот второй шаблон представляет собой время, в которое произошел первый шаблон:

Пример:

 <AZ>207994</AZ> <AZ>09:10:41.9</AZ> <AZ>02/04</AZ> <AZ>[990875]</AZ> <TR VALIGN=TOP> <AZ>207995</AZ> <AZ>09:10:56.4</AZ> <AZ>02/04</AZ> <AZ>[990876]</AZ> <AZ>30718</AZ><AZ><!--void--></AZ><AZ><!--void--></AZ><AZ><!--void--></AZ> <AZ>TN (speed) Event 3 occurred</TD></TR> <TR VALIGN=TOP> <AZ>30719</TD><TD><!--void--></AZ><AZ><!--void--></AZ><AZ><!--void--></AZ> <AZ>TN (speed) Event 100 occurred</TD></TR> <TR VALIGN=TOP> <AZ>30720</AZ><AZ><!--void--></AZ><AZ><!--void--></AZ><AZ><!--void--></AZ> 

Я хочу получить следующий результат:

02/04 09: 10: 56.4 [990876] Событие 100 произошло

2 Solutions collect form web for “Извлечение с помощью grep / sed первого шаблона, а затем второго шаблона, который имел некоторые строки до и связанные с первым”

Я придумал этот неприятный oneliner (разрывы строк для удобочитаемости):

 awk -F'[<>]' '($0 ~ /[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/) {time=$3} ($0 ~ /[0-9][0-9]\/[0-9][0-9]/) {date=$3} ($0 ~ /\[[0-9]+\]/) {tag=$3} ($0 ~ /Event 100 occurred/) { print date, time, tag, "Event 100 occurred"}' < testfile 

Это последовательно собирает вещи, которые выглядят как время, дата или тег ([12345]), и если возникает строка типа «Событие 100», выводится текущее содержимое переменных. Это желаемый результат?

Это должно сделать трюк:

 (grep -oP "Event 100" file && \ sed -ne 's/<\/\?AZ>//g' -e '7,9p' file) | \ awk 'BEGIN {RS=""; FS="\n";} \ {printf "%s %s %s %s\n", $3, $2, $4, $1}' 

Объяснение :

  • file : файл, содержащий выведенный выше файл
  • grep -oP "Event 100" file : Ищет «Событие 100»,
  • sed -ne 's/<\/\?AZ>//g' -e '7,9p' file : если строка была найдена, удалите теги <AZ> и </AZ> и напечатайте строки 7 на 9
  • awk 'BEGIN {RS=""; FS="\n";} awk 'BEGIN {RS=""; FS="\n";} : установить сепатор поля awk в новую строку
  • {printf "%s %s %s %s\n", $3, $2, $4, $1} : и распечатать вывод в нужном порядке

Выход (если строка найдена):

 02/04 09:10:56.4 [990876] Event 100 

Если строка не найдена, выход отсутствует.

  • Подсчет количества записей в столбце 2, где столбец 1 аналогичен
  • как совместить слова и игнорировать пробелы
  • Какие символы следует избегать при изменении файла с помощью sed?
  • Удалите повторяющиеся строки, сохраняя порядок строк
  • Как заменить строку в файлах, кроме строки, начинается с #
  • Как фильтровать базовые csv по столбцам
  • Как подсчитать количество слов и напечатать строки, соответствующие точному шаблону?
  • Как избежать несбалансированных скобок или слэш в sed?
  • Переформатирование отрицательных чисел с помощью sed или awk
  • Как удалить строку, если она содержит символ ровно один раз
  • «Тюнинг» выражения tr и sed
  • заменить строку сложного текста в нескольких файлах
  • Linux и Unix - лучшая ОС в мире.