Linux 在两个连续行上搜索两个图案,并在匹配前打印n行
我想使用shell命令对匹配两种不同模式的两个连续行进行grep或搜索,例如,对line1:abc进行匹配,对line2:def进行匹配。因此,对于以下文本,应该有一个匹配项:第4行和第5行Linux 在两个连续行上搜索两个图案,并在匹配前打印n行,linux,bash,shell,grep,Linux,Bash,Shell,Grep,我想使用shell命令对匹配两种不同模式的两个连续行进行grep或搜索,例如,对line1:abc进行匹配,对line2:def进行匹配。因此,对于以下文本,应该有一个匹配项:第4行和第5行 1234 abc-noise 6789 abc-noise def-noise def-noise 1234 当我找到这样一个匹配,我想打印它,包括N行之前的匹配。有什么想法吗?谢谢。在PCRE模式下使用GNU grep,启用-p标志 grep -ozP ".*abc.*\n.*def.*" file
1234
abc-noise
6789
abc-noise
def-noise
def-noise
1234
当我找到这样一个匹配,我想打印它,包括N行之前的匹配。有什么想法吗?谢谢。在PCRE模式下使用GNU grep,启用-p标志
grep -ozP ".*abc.*\n.*def.*" file
对输入文件使用pcregrep
cat file
1234
abc-noise
6789
abc-noise
def-noise
def-noise
1234
noise-abc-noise
noise-noise-def
对于多行模式匹配,请执行以下操作:
pcregrep -M 'abc.*\n.*def' file
abc-noise
def-noise
noise-abc-noise
noise-noise-def
对于模式匹配之前的行,使用-B标志,如GNU grep中所示
更多关于man pcregrep页面中的标志-M和-B的信息
-M、 -多行
允许模式匹配多行。当给出此选项时,模式可能有用地包含文字换行符和内部字符
^和$字符的出现。成功匹配的输出可能包含多行,最后一行是
比赛结束了。如果匹配的字符串以换行序列结尾,则输出将在该行的末尾结束
-B编号,-上下文之前=编号
在每个匹配行之前输出上下文的行数。如果输出文件名和/或行号,则使用连字符分隔符
上下文行的冒号。包含-的行是每组行之间的输出,除非它们在输入中实际上是连续的
文件
在PCRE模式下使用GNU grep,启用-p标志
grep -ozP ".*abc.*\n.*def.*" file
对输入文件使用pcregrep
cat file
1234
abc-noise
6789
abc-noise
def-noise
def-noise
1234
noise-abc-noise
noise-noise-def
对于多行模式匹配,请执行以下操作:
pcregrep -M 'abc.*\n.*def' file
abc-noise
def-noise
noise-abc-noise
noise-noise-def
对于模式匹配之前的行,使用-B标志,如GNU grep中所示
更多关于man pcregrep页面中的标志-M和-B的信息
-M、 -多行
允许模式匹配多行。当给出此选项时,模式可能有用地包含文字换行符和内部字符
^和$字符的出现。成功匹配的输出可能包含多行,最后一行是
比赛结束了。如果匹配的字符串以换行序列结尾,则输出将在该行的末尾结束
-B编号,-上下文之前=编号
在每个匹配行之前输出上下文的行数。如果输出文件名和/或行号,则使用连字符分隔符
上下文行的冒号。包含-的行是每组行之间的输出,除非它们在输入中实际上是连续的
文件
发布:
$./find2pat
wegweg
egwergwerg
sdfabcerg
rrheedef4
输出:
sdfabcerg
rrheedef4
发布:
$./find2pat
wegweg
egwergwerg
sdfabcerg
rrheedef4
输出:
sdfabcerg
rrheedef4
如果您想在整个目录中进行递归搜索,请扩展@Inian的伟大答案: 查找my_code_dir/-type f-name*.py-exec pcregrep-B2-M'except.*\n.*pass'{}+
此特定命令将查找包含以下内容的引用行:后面紧跟着包含pass的行,但仅在.py文件中。如果要递归搜索整个目录,请扩展@Inian的伟大答案: 查找my_code_dir/-type f-name*.py-exec pcregrep-B2-M'except.*\n.*pass'{}+
此特定命令将查找包含以下内容的引用行:后面紧跟着包含pass的行,但仅在.py文件中。到目前为止您编写了什么?您是否尝试使用grep、sed或任何工具。发布你的研究成果没什么可展示的。我尝试了“grep-B1 def | grep-A1 abc”,但后来我被困在了如何在赛前获得N行的问题上。其中-B1在匹配前输出一行,而-A1在匹配后输出一行可能的重复:不是真正的重复。棘手和不同的部分是,在连续行匹配之前,我还需要输出N行。到目前为止,您写了什么?您是否尝试使用grep、sed或任何工具。发布你的研究成果没什么可展示的。我尝试了“grep-B1 def | grep-A1 abc”,但后来我被困在了如何在赛前获得N行的问题上。其中-B1在匹配前输出一行,而-A1在匹配后输出一行可能的重复:不是真正的重复。棘手和不同的部分是,我还需要在连续行匹配之前输出N行。谢谢,在匹配之前打印N行的要求是什么?我以前用额外的标记-B3尝试过你的解决方案,用了3行,但它不起作用。@user2405602:你能用pcregrep吗?你能看看它是否已安装吗?哪个pcregrep?是的,它已安装,但我根据您最初的建议找到了解决方案。在匹配之前,您可以再获得两行代码:grep-ozP.*\n.*\n.*abc.*\n.*def.*文件,因此只需为每一行添加一个.*\n即可。不太优雅,但很有效。@user2405602:您不必发布这是一个答案。你可以接受我在答案左边的答案,让人们
我知道你已经解决了这个问题。也请参考我使用pcregrep的解决方案–谢谢,比赛前打印N行的要求如何?我以前用额外的标记-B3尝试过你的解决方案,用了3行,但它不起作用。@user2405602:你能用pcregrep吗?你能看看它是否已安装吗?哪个pcregrep?是的,它已安装,但我根据您最初的建议找到了解决方案。在匹配之前,您可以再获得两行代码:grep-ozP.*\n.*\n.*abc.*\n.*def.*文件,因此只需为每一行添加一个.*\n即可。不太优雅,但很有效。@user2405602:您不必发布这是一个答案。你可以接受我在答案左边的答案,让人们知道你已经解决了这个问题。也请参考我使用pcregrep的解决方案–谢谢,这里有相同的注释,关于比赛前打印N行的要求如何?谢谢,这里有相同的注释,关于比赛前打印N行的要求如何?