【问题标题】:Perl Regex Multiple Matching with NagiosgraphPerl 正则表达式与 Nagiosgraph 的多重匹配
【发布时间】:2013-06-26 09:46:01
【问题描述】:

我正在使用 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%”)。

我在这里遗漏了什么明显的东西吗?

【问题讨论】:

  • 正则表达式看起来不错,这个问题可能与你如何使用它有关,例如你是如何得到线条的

标签: regex perl nagios


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    说明

    这对我有用。我修改了您的声明以包含不区分大小写的选项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%
    

    【讨论】:

    • 谢谢。事实证明,正则表达式或多或少是正确的(正如您所指出的),但问题来自 Nagiosgraph 的测试脚本处理数据的方式与实时版本相比存在差异。测试脚本解析整个输出,而 live 似乎在第一个回车处停止,这就是它只返回一个结果的原因。我修改了正在发送的输出以删除回车,并且正则表达式现在可以正常工作。
    • 优秀。在此网站上,您应该将其作为答案提交并接受。
    • 是的,我知道,但我在提交后 8 小时内无法回答自己的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多