在定界区域外查找短语
Finding phrase outside a delimited region
我正在为日志文件编写正则表达式来检测事件。我想做的是检测短语 "restart-required"
是否出现在日志中,但棘手的部分是,我想忽略所有调试消息。不幸的是,日志没有以任何形式被删除,只是 运行 在一起。
好消息是,我所有的调试消息都以 'Debug:'
开头并以 'endmsg'.
结尾
到目前为止,我能够组合在一起的是一个正则表达式,用于捕获我所有的调试短语。
/Debug:\s(.+?(?=endmsg))/gm
我从这里无法弄清楚的是如何扩展它以搜索短语 'restart-required'
但如果它在这些捕获的调试消息之一中则忽略它。
我正在使用的 regex101 - https://regex101.com/r/zI1kM2/3
我不想捕捉短语或任何相关的东西,而只是一个布尔值 True
/False
来回答问题 "Does the phrase 'restart-required'
occur somewhere in the logs outside of debug messages?"
谢谢!
不是直接为您想要的任务编写正则表达式,而是可以从日志中删除所有调试消息,然后在剩余的日志消息中搜索(使用或不使用正则表达式)字符串 'restart-required'
.
要删除调试消息,请将正则表达式 Debug:.*?endmsg
的匹配项替换为空字符串 ''
。
您可以使用的一个正则表达式是:Debug.*?endmsg|(restart-required)
.
这将首先匹配所有的Debug
语句,如果不匹配,它将尝试匹配右侧的组(具有捕获组的组)。在处理匹配项时,查找是否有任何匹配项具有第一个捕获组。如果他们这样做,那么您可以 return true
.
Regex101 Example - 匹配项以绿色突出显示
有关这方面的更多信息,请阅读来自 Rexegg 的 The Best Regex Trick。
编辑:正在查看 this answer, I also came across a way in which PCRE has something like this already built in. It is with (*SKIP)
and (*F)
(more information here)。修改后的正则表达式为:
Debug.*?endmsg(*SKIP)(*F)|restart-required
它不需要检查任何捕获组,并且具有所需的输出。如果此正则表达式有任何匹配项,return true
.
试一试:
/(?=(^Debug:\s(.+?(?=endmsg))$))|(^.*restart-required.*$)/gm
如您所述,第一组使用正向前瞻来匹配调试消息,并且第一组不会包含在结果中,第二组 select 剩余行包含 需要重启.
我通常使用 shell 命令提供的 BRE 和 ERE,因此上面的 PCRE 正则表达式应该清理和测试。
网上有一些在线 pcre 控制台可以玩:例如Online Regex Tester,在页面上使用select框切换到PCRE。这对于使用日志文件示例测试 PCRE 正则表达式非常有用。
上面的测试仪使用了这些线路:
test line 1
Debug: blablabla with endmsg
test line 2
two words restart-required
Debug: one two three with endmsg
我正在为日志文件编写正则表达式来检测事件。我想做的是检测短语 "restart-required"
是否出现在日志中,但棘手的部分是,我想忽略所有调试消息。不幸的是,日志没有以任何形式被删除,只是 运行 在一起。
好消息是,我所有的调试消息都以 'Debug:'
开头并以 'endmsg'.
到目前为止,我能够组合在一起的是一个正则表达式,用于捕获我所有的调试短语。
/Debug:\s(.+?(?=endmsg))/gm
我从这里无法弄清楚的是如何扩展它以搜索短语 'restart-required'
但如果它在这些捕获的调试消息之一中则忽略它。
我正在使用的 regex101 - https://regex101.com/r/zI1kM2/3
我不想捕捉短语或任何相关的东西,而只是一个布尔值 True
/False
来回答问题 "Does the phrase 'restart-required'
occur somewhere in the logs outside of debug messages?"
谢谢!
不是直接为您想要的任务编写正则表达式,而是可以从日志中删除所有调试消息,然后在剩余的日志消息中搜索(使用或不使用正则表达式)字符串 'restart-required'
.
要删除调试消息,请将正则表达式 Debug:.*?endmsg
的匹配项替换为空字符串 ''
。
您可以使用的一个正则表达式是:Debug.*?endmsg|(restart-required)
.
这将首先匹配所有的Debug
语句,如果不匹配,它将尝试匹配右侧的组(具有捕获组的组)。在处理匹配项时,查找是否有任何匹配项具有第一个捕获组。如果他们这样做,那么您可以 return true
.
Regex101 Example - 匹配项以绿色突出显示
有关这方面的更多信息,请阅读来自 Rexegg 的 The Best Regex Trick。
编辑:正在查看 this answer, I also came across a way in which PCRE has something like this already built in. It is with (*SKIP)
and (*F)
(more information here)。修改后的正则表达式为:
Debug.*?endmsg(*SKIP)(*F)|restart-required
它不需要检查任何捕获组,并且具有所需的输出。如果此正则表达式有任何匹配项,return true
.
试一试:
/(?=(^Debug:\s(.+?(?=endmsg))$))|(^.*restart-required.*$)/gm
如您所述,第一组使用正向前瞻来匹配调试消息,并且第一组不会包含在结果中,第二组 select 剩余行包含 需要重启.
我通常使用 shell 命令提供的 BRE 和 ERE,因此上面的 PCRE 正则表达式应该清理和测试。
网上有一些在线 pcre 控制台可以玩:例如Online Regex Tester,在页面上使用select框切换到PCRE。这对于使用日志文件示例测试 PCRE 正则表达式非常有用。
上面的测试仪使用了这些线路:
test line 1
Debug: blablabla with endmsg
test line 2
two words restart-required
Debug: one two three with endmsg