我有以下日志文件..其中包含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/p
in 命令只会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
。