使用正则表达式排除术语

时间:2012-11-21 21:47:54

标签: regex perl nagios

我正在使用名为'check_logfiles'的nagios检查来解析一堆solaris机器上的syslog。它完全用Perl编写,并采用也使用Perl语法的配置文件。我试图使用正则表达式从检查的输出中排除以下行:

Nov 16 19:15:04 db07  Cluster.CCR: [ID 574345 daemon.debug] server address: 127.0.0.1

这是我试图使用的正则表达式(失败)

'^.*?(Cluster.CCR).*?$'

这是检查的整个配置文件,以备您可能需要一些上下文:

$options = 'report=long';
@searches = (
{
tag => 'syslog',
logfile => '/var/adm/messages',
rotation => 'SOLARIS',
options => 'noprotocol',
sticky  => 2400,
criticalpatterns => [
   'daemon.debug',
   'daemon.error',
   'Could not send report: Broken pipe',
   'Could not retrieve catalog from remote server: Error 400 on SERVER'
],
warningpatterns => [
    'daemon.warning',
    'daemon.info',
    'daemon.notice',
    'kern',
],
criticalexceptions => [
 'connect from nagioszone01.mydomain.com',
 'from 10.20.28.140',
 'Finished catalog run in',
 'Did not receive identification string from',
 '^.*?(Cluster.CCR).*?$'
],
 warningexceptions => [
 'connect from nagioszone01.mydomain.com',
 'from 10.20.28.140',
 'Finished catalog run in',
 'Did not receive identification string from',
 'Cluster.CCR'
],
 options => 'logfilenocry,sticky=900',
});

感谢您提出的任何建议

2 个答案:

答案 0 :(得分:0)

我不知道你是否解决了,但我建议使用WOTS来完成任务。 我维护并扩展了原始的WOTS,并将它完全用于这些设置。如果你想向nagios发送被动警报,它是一个带有集成nsca客户端的perl守护进程。包括大量的例子。 对于WOTS:http://www.e-dynamics.be/?section=programs

答案 1 :(得分:-2)

正则表达式无法排除“单词” - 所以你需要使用workarround

想象一下,你想在div中匹配“EverythingTHING”,但不是,如果 其中有“花”这个词(你不喜欢花,所以你不想与之匹配。)

匹配div-tags之间的所有内容:

/<div>([^<]+?)<\/div>/

不是杰作。

我们“不能”排除单词 - 但我们可以排除后跟短语的字符。 所以我们排除任何字符后跟“lower”:

/<div>([^<](?!lower))+?)<\/div>/

这与其他单词(“Glower”“Alower”)的文本不匹配......

所以我们需要用另一个“lookbehind”来“修改”我们的“前瞻”:

/<div>((?:[^<](?!(?<=F)lower))+?)<\/div>/

在您的情况下,您可以使用^$代替div标签,并选择一些不应位于匹配值内的随机字。

<div>((?:[^<](?!(?<=F)lower))+?)<\/div>

Regular expression visualization

Debuggex Demo

(但是,如果你想排除整行 - 为什么要使用正则表达式?)