Извлечение с помощью 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 произошло

  • Sed для копирования части имени файла в другое содержимое файла с той же подстрокой
  • Выключение как косой черты, так и обратной косой черты с помощью sed
  • Как рассчитать средние запросы за секунды, используя awk или sed в журналах Apache
  • Получить текущий часовой пояс на Centos 7
  • Заменить слово после значительных строк и пробелов (inline) с помощью sed?
  • sed regex для группы захвата между разделителями
  • Удаление лишних пробелов, но не новая строка из csv-файлов
  • Извлечение данных из текстового файла
  • 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 

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

    Linux и Unix - лучшая ОС в мире.