Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在两个连续行上搜索两个图案,并在匹配前打印n行_Linux_Bash_Shell_Grep - Fatal编程技术网

Linux 在两个连续行上搜索两个图案,并在匹配前打印n行

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

我想使用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
对输入文件使用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行的要求如何?