Содержать содержимое в файле, аналогичном приведенному ниже. Между 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
Попытка:
$ 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