文件中的内容类似于以下内容 - 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