Фильтр строк между совпадающими строками

Содержать содержимое в файле, аналогичном приведенному ниже. Между START и amp; END и может иметь ошибки / предупреждения тоже. Я хочу отфильтровать строки ошибок / предупреждений между START & amp; Конец и пропустить, если не имеет. Заголовок меняется с разными именами. Но сделайте логику печати следующей строки START (должен быть заголовок)

START
Heading1
.......
errors
........
END

START
Heading2
........
........
........
END

START
Heading3
.......
errors
Warning...
END

Ожидаемый вывод ниже

Heading1
errors

Heading3
errors
Warning...

Я пробовал ниже, но это печатает все между START и amp ; КОНЕЦ . Я тоже должен отфильтровать ошибки

awk '/START/,/END/' file
2
задан 19 June 2019 в 08:36

1 ответ

Попытка:

$ awk 'f{hdg=$0; f=0} /errors|warning/{if(hdg){print hdg; hdg=""}; print} /START/{f=1}' file
Heading1
errors
Heading3
errors

Как это работает

  • f{hdg=$0; f=0}

    Если f верен (ненулевой), затем сохраните текущую строку в переменной hdg и набор f назад обнулять.

  • /errors|warning/{if(hdg){print hdg; hdg=""}; print}

    Если текущая строка содержит errors или warning, затем, если переменная hdg непусто, распечатайте его. Кроме того, распечатайте текущую строку.

  • /START/{f=1}

    Если текущая строка содержит START, затем переменная набора f одному.

Многострочная версия

Для тех, кто предпочитает их команды, распространенные по нескольким строкам:

awk '
   f {
      hdg=$0
      f=0
   }
   /errors|warning/{
      if(hdg){
         print hdg
         hdg=""
      }
      print
   }
   /START/{
      f=1
   }' file

Изменение: Добавьте пустую строку перед заголовком

Если мы хотим, чтобы пустая строка разделила вывод:

$ awk 'f{hdg=$0; f=0} /errors|warning/{if(hdg){print nl hdg; hdg=""; nl="\n"}; print} /START/{f=1}' file
Heading1
errors

Heading3
errors

Изменение: Проигнорируйте ошибки/предупреждения после строки КОНЦА

$ awk 'f{hdg=$0; f=0} g && /errors|warning/{if(hdg){print nl hdg; hdg=""; nl="\n"}; print} /START/{f=1; g=1} /END/{g=0}' file
Heading1
errors

Heading3
errors

Сделать вышеупомянутое нечувствительным к регистру (GNU awk):

awk 'BEGIN{IGNORECASE=1} f{hdg=$0; f=0} g && /errors|warning/{if(hdg){print nl hdg; hdg=""; nl="\n"}; print} /START/{f=1; g=1} /END/{g=0}' file
2
ответ дан 19 June 2019 в 08:36

Другие вопросы по тегам:

Похожие вопросы: