在模式之前和之后打印不同数量的行

在模式之前和之后打印不同数量的行

我有一个包含数千个文件的目录,其重复模式包含数百个部分 -

###############
# Section 1
###############
some text
more text
some more text
some text
more text
some more text    
###############
# Section 2
###############
some text
more text
some more text
interesting-pattern
some text
more text
some more text    
###############
# Section 3
###############
some text
more text
some more text
some text
more text
some more text

我需要做的是找出一种方法来提取存在“有趣模式”的整个部分。

我尝试使用 -A 和 -B 标志执行 grep -iEr 'interesting-pattern' 但这不起作用,因为在每个文件中,有趣模式之前和之后的部分可能有不同的行数。

做这个的最好方式是什么?

答案1

这不是 grep 的工作,而是像 awk 这样更好的工具的工作。

简单的解决方法是使用 gnu awk 和自定义记录分隔符 RS,例如Section.

使用单词“Section”来分隔行,单词之间的任何内容Section 1Section 2将被 awk 视为一行。
第 2 节 - 第 3 节等相同。

现在您只需要打印正确的“line” = 包含interesting-pattern.

$ awk -v RS="# Section " '/interesting-pattern/{print RT $0}' file1
# Section 2
###############
some text
more text
some more text
interesting-pattern
some text
more text
some more text    
###############

由于 gnu awk 可以接受 RS(记录分隔符)中的正则表达式,因此您还可以在 RS 中应用更复杂的东西,如下所示:

$ awk -v RS="###############\n# Section " '/interesting-pattern/{print RT $0}'
###############
# Section 2
###############
some text
more text
some more text
interesting-pattern
some text
more text
some more text    

PS:{print RT指示awk打印当前使用的记录分隔符

相关内容