regex 使用awk打印两个标记之间的完整文本块,仅当块不包含特定关键字时

l2osamch  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(110)

我的档案里有这样一个模式:

....
BEGIN
any text1
any text2
END
....
BEGIN
any text3
garbage text
any text4
END
....
BEGIN
any text5
any text6
END
...

BEGINEND是我的标记,只有当块不包含'garbage text '时,我才想提取标记之间的所有文本。所以我的期望是提取吹塑块:

any text1
any text2

any text5
any text6

我怎么在awk里做呢?我知道我可以做这样的事情:

awk '/BEGIN/{f=1;next}/END/{f=0;}f' file.log

来提取两个标记之间的线,但是我如何通过基于不存在' garbage text '的进一步过滤来进一步细化结果?

pftdvrlh

pftdvrlh1#

$ awk '/END/{if (rec !~ /garbage text/) print rec} {rec=rec $0 ORS} /BEGIN/{rec=""}' file
any text1
any text2

any text5
any text6

以上假设每个END都与前面的开始配对。使用GNU awk for multi-char RS,您可以选择:

$ awk -v RS='END\n' '{sub(/.*BEGIN\n/,"")} RT!="" && !/garbage text/' file
any text1
any text2

any text5
any text6

btw而不是:

awk '/BEGIN/{f=1;next}/END/{f=0;}f' file.log

你的原始代码应该是:

awk '/END/{f=0} f; /BEGIN/{f=1}' file.log

有关相关习惯用法,请参见使用sed或awk在匹配模式之后打印一行。

相关问题