Perl Regex与Nagiosgraph的多重匹配

时间:2013-06-26 09:46:02

标签: regex perl nagios

我正在使用Nagiosgraph尝试创建一个正则表达式来匹配Nagios插件中的多行输出数据,我无法让它输出超过第一个匹配项。我曾尝试使用和不使用/ g修饰符以及许多其他建议,不同的人已经在其他讨论中发布但仍然无处可去。

我使用的数据格式为:

    output:DISK: C - WARNING : Percent Used : 85.5% (WARN: 85% / CRIT: 95%), Total : 49.9 GiB, Used : 42.7 GiB,  Free : 7.2 GiB
    DISK: C(id: 1) - WARNING : Percent Used : 85.5% (WARN: 85% / CRIT: 95%), Total : 49.9 GiB, Used : 42.7 GiB,  Free : 7.2 GiB
    DISK: D(id: 2) - OK : Percent Used : 13.7% (WARN: 85% / CRIT: 95%), Total : 84.6 GiB, Used : 11.6 GiB,  Free : 73 GiB
    DISK: E(id: 3) - OK : Percent Used : 19.6% (WARN: 85% / CRIT: 95%), Total : 418.6 GiB, Used : 82.2 GiB,  Free : 336.3 GiB

我正在使用的正则表达式是:

    /.*?DISK: (\w)[(]id: [.0-9]+[)].*?Percent Used : ([.0-9]+%).*?/g

我想要的只是磁盘ID和%用于每一行" id"值,但是当我浏览生成的变量时,它只匹配第一个实例(" 1"&" 85.5%")。

我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:1)

事实证明正则表达式是正确的(正如所指出的那样),但问题来自于Nagiosgraph的测试脚本处理数据与实时版本相比的方式不一致。

测试脚本解析整个输出,而live似乎在第一次回车时停止,这就是为什么它只返回一个结果。我修改了发送的输出以删除回车,正则表达式现在正常工作。

答案 1 :(得分:0)

描述

这对我有用。我修改了您的语句以包含不区分大小写的选项i,它开始工作。我还添加了一个字符串锚点的开头,强制正则表达式引擎只匹配每行开头的字符串

Perl代码示例

$string =  <<END;
output:DISK: C - WARNING : Percent Used : 85.5% (WARN: 85% / CRIT: 95%), Total : 49.9 GiB, Used : 42.7 GiB,  Free : 7.2 GiB
DISK: C(id: 1) - WARNING : Percent Used : 85.5% (WARN: 85% / CRIT: 95%), Total : 49.9 GiB, Used : 42.7 GiB,  Free : 7.2 GiB
DISK: D(id: 2) - OK : Percent Used : 13.7% (WARN: 85% / CRIT: 95%), Total : 84.6 GiB, Used : 11.6 GiB,  Free : 73 GiB
DISK: E(id: 3) - OK : Percent Used : 19.6% (WARN: 85% / CRIT: 95%), Total : 418.6 GiB, Used : 82.2 GiB,  Free : 336.3 GiB
END
while ($string =~ m/.*?DISK: (\w)[(]id: [.0-9]+[)].*?Percent Used : ([.0-9]+%).*?/ig ) {
print "id = $1, Percent = $2\n";

输出

id = C, Percent = 85.5%
id = D, Percent = 13.7%
id = E, Percent = 19.6%