如何用grep命令搜索连续出现的两行?

254 浏览
0 Comments

如何用grep命令搜索连续出现的两行?

我需要找到所有包含特定字符串模式的文件。第一个想到的解决方案是使用find命令与xargs grep命令配合使用:

find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'

但是如果我需要查找跨越多行的模式,我会遇到困难,因为普通的grep命令无法找到多行模式。

0
0 Comments

最近在处理一些文本文件时,遇到了一个问题,就是如何使用grep命令连续匹配两行的情况。在尝试解决这个问题的过程中,我找到了一些有用的方法。

首先,有人建议使用awk命令来解决这个问题。通过以下命令可以实现连续匹配两行:

awk '/开始模式/,/结束模式/' 文件名

这种方法非常简单易懂,而且awk命令在大多数*nix系统中都已经安装了。

另外,还有人问道,是否有办法让匹配变得非贪婪?其实可以通过以下命令实现:

awk '/开始模式/,/结束模式/ {printf NR " "; print}' 文件名

通过这个命令,我们可以显示匹配行的行号。如果想要让行号的宽度固定,可以使用以下命令:

awk '/开始模式/,/结束模式/ {printf "%-4s ", NR; print}' 文件名

然后,有人问道,如果想要在多个文件中进行搜索怎么办?这时可以使用管道命令。例如,可以使用以下命令递归搜索当前目录下所有的txt文件:

find . -name "*.txt" | xargs -n1 awk '/开始模式/,/结束模式/'

此外,还某些情况下了使用grep命令找到包含关键词的文件列表,然后再使用awk命令通过for...in循环逐个处理文件的方法。

还某些情况下,要想实现非贪婪匹配是比较困难的。不过,如果使用pcregrep命令,则可以实现非贪婪匹配。

最后,有人感谢这些方法帮助他筛选了一些需要多行匹配的日志文件。

在解决问题的过程中,还某些情况下了一个额外的问题,就是如何只输出开始模式和结束模式之间的内容,而不包括开始模式和结束模式本身。对于这个问题,目前还没有找到简单的解决方法,因为待匹配字符串的长度是不固定的。

通过以上的方法,我成功解决了我的问题,并收集了一些有关grep连续匹配两行的方法。希望这些方法也能对其他人有所帮助。

0
0 Comments

如何在文本中使用grep命令查找连续的两行?这个问题的出现是因为需要在文本中找到一个变量后面紧跟着的另一个变量。解决这个问题的方法是使用pcregrep命令,它是Perl兼容的正则表达式GREP。

pcregrep命令的-M选项可以在跨越多行的情况下搜索模式。例如,你想要找到文件中'_name'变量后面紧跟着的'_description'变量,可以使用以下命令:find . -iname '*.py' | xargs pcregrep -M '_name.*\n.*_description'。需要注意的是,你需要在模式中包含换行符。根据平台的不同,换行符可能是'\n'、'\r'、'\r\n'等。

如下所示,你还可以通过在正则表达式中添加(?s)来使点通配符匹配换行符,然后使用带有perl正则表达式的grep命令。命令示例:find . -exec grep -nHP '(?s)SELECT.{1,60}FROM.{1,20}table_name' '{}' \;

pcregrep命令可以通过brew install pcre在Mac上安装。

更好的方法是在匹配之前使用-H选项,它会在每个匹配之前打印文件名:pcregrep -HM

如果在处理类似<(cat file.txt | tr '\0' '\n')这样的简单文本文件时出现pcregrep: line 1 of file /dev/fd/63 is too long for the internal buffer的错误信息,可以尝试解决该问题。

0
0 Comments

如何连续搜索两行的问题的出现原因是无法使用grep进行多行搜索,除非使用-z标志将整个文件作为一行处理,并使用-o标志仅打印匹配部分。然而,使用-o标志时没有打印任何内容,但使用-l标志可以获得文件列表。根据推荐,最好使用grep -Pazo而不是-Pzo来处理非ASCII文件,并使用-a | --text开关防止出现二进制数据行为。然而,这种方法在安装了brew reinstall --with-pcre git的Mac上不起作用。

解决方法是使用GNU grep,并使用以下命令进行搜索:

grep -Pzo '_name.*\n.*_description'

其中,-z / --null-data选项将输入视为一组以零字节(ASCII NUL字符)而不是换行符终止的行。这样的效果是将整个文件视为一行。通过在命令中添加-z选项,可以实现多行搜索。

此外,推荐使用grep -Pazo而不是-Pzo来处理非ASCII文件。此命令中的-a | --text开关可以防止二进制数据行为。

然而,需要注意的是,这种方法在安装了brew reinstall --with-pcre git的Mac上可能无法正常工作。

0