我有一个包含数千个文件的目录,其重复模式包含数百个部分 -
###############
# 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 1
都Section 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打印当前使用的记录分隔符