使用Perl中的引用点从文件的某些部分创建一个字符串

时间:2013-04-11 16:13:35

标签: perl parsing

我正在寻找创建一个查看snmp MIB的Perl脚本,从中提取给定参考点的MIB部分,并将结果添加到字符串中。

例如,这是我正在使用的部分数据:

      udpOutDatagrams OBJECT-TYPE
          SYNTAX  Counter
          ACCESS  read-only
          STATUS  mandatory
          DESCRIPTION
                  "The total number of UDP datagrams sent from this
                  entity."
          ::= { udp 4 }


      -- the UDP Listener table

      -- The UDP listener table contains information about this
      -- entity's UDP end-points on which a local application is
      -- currently accepting datagrams.

      udpTable OBJECT-TYPE
          SYNTAX  SEQUENCE OF UdpEntry
          ACCESS  not-accessible
          STATUS  mandatory
          DESCRIPTION
                  "A table containing UDP listener information."
          ::= { udp 5 }

      udpEntry OBJECT-TYPE
          SYNTAX  UdpEntry
          ACCESS  not-accessible
          STATUS  mandatory
          DESCRIPTION
                  "Information about a particular current UDP
                  listener."
          INDEX   { udpLocalAddress, udpLocalPort }
          ::= { udpTable 1 }

我正在寻找对象名称,添加逗号,然后是描述:

udpOutDatagrams, The total number of UDP datagrams sent from this entity.
udpTable, A table containing UDP listener information.
udpEntry, Information about a particular current UDP listener.

可以使用一些参考点:

  1. 所有名称后面紧跟着字符串“OBJECT-TYPE”。
  2. 所有说明都用双引号括起来,并紧跟一行“DESCRIPTION”
  3. 我已经整理了一个基本框架来处理这个问题。只需要一些关于用于创建名称/描述字符串的逻辑的建议。

    更新:基于SinanÜnür答案的基本脚本。这一切都可以通过this完成。

    #!/usr/local/bin/perl -w
    use strict;
    use SNMP;
    $SNMP::save_descriptions = 1;
    my $mib = $ARGV[0];
    my $object;
    
    &SNMP::addMibDirs("/usr/share/snmp/mibs/allMibs/");
    &SNMP::loadModules($mib);
    &SNMP::initMib();
    
    foreach my $key ( keys %SNMP::MIB )
    {    
      print "$SNMP::MIB{$key}{label}, $SNMP::MIB{$key}{description}, $SNMP::MIB{$key}{objectID}\n"
    };
    

2 个答案:

答案 0 :(得分:3)

您是否考虑过使用SNMP?它会为您提供%SNMP::MIB hash

  

用于访问已解析的MIB信息的绑定哈希。在加载MIB​​之后,该散列允许访问在MIB元数据中解析的(MIB的结构(即,模式))。散列返回对SNMP :: MIB :: NODE对象的祝福引用,这些对象表示单个MIB属性。可以使用多个“密钥”格式(叶子名称(例如,sysDescr)或完全/部分限定名称(例如,system.sysDescr)或完全限定的数字OID)来获取节点。

答案 1 :(得分:0)

正则表达式似乎是最简单的方法。

只需解析文件,找到“OBJECT-TYPE”行,然后将“OBJECT-TYPE”之前的文字作为名称。

之后查找“DESCRIPTION”,然后查找紧跟在之后的引号之间的文本。

然后重复!