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

Проверьте GMailWatcher. Он все еще находится на ранней стадии разработки, но работает достаточно хорошо. Я использую его уже более месяца. Рекомендуемый.

Вводный блогпост: owaislone.org/blog/2010/jul/gmail-watcher URL-адрес запуска: https://launchpad.net/gmailwatcher

PPA

$ sudo add-apt-repository ppa:loneowais/ppa $ sudo apt-get update && sudo apt-get install gmailwatcher
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

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

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