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

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

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

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

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

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

Ожидаемый результат ниже

Heading1
errors

Heading3
errors
Warning...

Я попробовал ниже, но это печатает все между START и END. Мне также нужно отфильтровать ошибки

awk '/START/,/END/' file

решение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

Вариант: игнорировать ошибки/предупреждения после строки END

$ 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

Связанный контент