【问题标题】:Regex and sed in sh script not evaluating properlysh 脚本中的正则表达式和 sed 无法正确评估
【发布时间】:2015-08-04 20:42:12
【问题描述】:

第一篇文章在这里。尝试使用正则表达式仅捕获来自 SNMP 回复的整数输出。我使用正则表达式测试器来提出正确的模式匹配,但 sed 拒绝输出结果。现在这只是一个原始的事实调查脚本,它会发展成更复杂的东西,但现在这是我的绊脚石。

对snmpget语句每一行的回复是:

IF-MIB::ifInOctets.1001 = Counter32: 692749329
IF-MIB::ifOutOctets.1001 = Counter32: 3119381688

我只想捕获“Counter32:”之后的值,而正则表达式 (?

#!/bin/sh
SED_IFACES="-e '/(?<=: )(\d+)/g'"
INTERNET_IN=`snmpget -v 2c -c public 123.45.678.9 1.3.6.1.2.1.2.2.1.10.1001` | eval sed $SED_IFACES
INTERNET_OUT=`snmpget -v 2c -c public 123.45.678.9 1.3.6.1.2.1.2.2.1.16.1001` | eval sed $SED_IFACES
echo $INTERNET_IN
echo $INTERNET_OUT

【问题讨论】:

    标签: regex sed sh


    【解决方案1】:

    你可以的

    sed 's/^.*Counter32: \(.*\)$/\1/'
    

    捕获值并使用 \1 将其打印出来。

    另外请注意,您在示例中使用了 Perl 正则表达式,而 sed 不支持这些。它也缺少替换“s/”部分。

    【讨论】:

    • 我确实也必须摆脱反引号,我只是在某个地方读到它们已被弃用。你的正则表达式就像一个魅力,不知道吗? sed 不支持。谢谢! INTERNET_OUT=$(snmpget -v 2c -c public 172.16.0.1 1.3.6.1.2.1.2.2.1.16.1001 | sed 's/^.*Counter32: (.*)$/\1/')
    • (?&lt;=: ) 不是扩展的正则表达式 (ERE) 语法,它是由 Perl 正则表达式 (PCRE) 支持的,令人惊讶的是,Perl 不是 sed 或 awk。 sed 默认支持基本的正则表达式 (BRE),使用 -r 扩展以使 GNU sed 支持 ERE。 awk 始终支持 ERE。
    • 感谢您的澄清
    【解决方案2】:
    $ cat file
    IF-MIB::ifInOctets.1001 = Counter32: 692749329
    IF-MIB::ifOutOctets.1001 = Counter32: 3119381688
    
    $ awk '{print $NF}' file
    692749329
    3119381688
    
    $ sed 's/.* //' < file
    692749329
    3119381688
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      相关资源
      最近更新 更多