Иметь содержимое в файле, похожее на следующее: между 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