1

我正在使用 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”值的每一行的 %,但是当我运行生成的 var 时,它只匹配第一个实例(“1”和“85.5%”)。

我在这里遗漏了一些明显的东西吗?

4

2 回答 2

1

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

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

于 2013-06-27T07:42:12.977 回答
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%
于 2013-06-26T12:30:28.063 回答