正则表达式匹配包含 ## 的两行之间的错误

正则表达式匹配包含 ## 的两行之间的错误

我有以下日志文​​件..其中包含some_error_message.如果出现在包含(回显为“ ”)some_error_message的两行之间,我们认为远程 ftp/sftp 站点发生错误。####

some content in log file..
##
some content in log file..

some_error_message

some content in log file..
##
some content in log file..

现在,我想编写正则表达式来匹配some_error_message包含符号的行##

下面只是一个示例

grep -iq "^[#][#].*some_error_message.*[#][#]$"

请帮忙!!

注意:日志中只会出现 4 个 # 符号。不再。 ## 在一行,## 在另一行。

答案1

像这样的工具grep一次只能匹配一行,因此在使用grep.

sed您可以使用诸如仅提取嵌套块中的部分之类的工具,然后将其通过管道来grep查找您感兴趣的错误消息。

/START/,/END/pin 命令只会sed打印块之间以与两个正则表达式匹配的行开头和结尾的行。此外,您应该传递sed一个-n参数,这样默认情况下它不会打印任何行。

所以:

$ sed -n '/^##$/,/^##$/p' mylogfile.txt |
  grep -iq '^some_error_message$'

答案2

Perl 可以轻松地处理这个问题范围运算符,有时称为flip-flop运算符:

perl -nle 'if (/^##/.../^##/) {print if /some_error_message/i}' file

这会读取您的文件,查找开头和结尾均锚定##于行首的块。在块内,任何带有令牌的行some_error_message都会被打印。在此示例中,“some_error_messsage”的匹配不区分大小写。

答案3

简单版本,只是sed(通常不需要管道sed输出,只需将命令与 串联起来;):

sed '/^##$/,//!d;/some_error_message/!d'

^##$首先,我们创建一个从(一行##)到一个空模式(这意味着:重复最后一个模式,因此又是一行)的地址范围##。反转匹配!d删除范围之外的所有内容。

其次,d删除所有不!包含 ( ) 的行some_error_message

相关内容