2013-07-23 68 views
2

走在树时,我接到了一个系统下面的示例响应:如何拆分SNMP阵列的响应?

[name=1.3.6.1.4.1.15248.2.5.1.3.1.1.8650, value=8650 (INTEGER)] 
[name=1.3.6.1.4.1.15248.2.5.1.3.1.1.8651, value=8651 (INTEGER)] 
[name=1.3.6.1.4.1.15248.2.5.1.3.1.2.8650, value=QNewsAK (OCTET STRING)] 
[name=1.3.6.1.4.1.15248.2.5.1.3.1.2.8651, value=QSuite4AK (OCTET STRING)] 
[name=1.3.6.1.4.1.15248.2.5.1.3.1.3.8650, value=46835255 (INTEGER)] 
[name=1.3.6.1.4.1.15248.2.5.1.3.1.3.8651, value=11041721 (INTEGER)] 
[name=1.3.6.1.4.1.15248.2.5.1.3.1.4.8650, value=8442357 (INTEGER)] 
[name=1.3.6.1.4.1.15248.2.5.1.3.1.4.8651, value=5717570 (INTEGER)] 
[name=1.3.6.1.4.1.15248.2.5.1.3.1.5.8650, value=0 (INTEGER)] 
[name=1.3.6.1.4.1.15248.2.5.1.3.1.5.8651, value=0 (INTEGER)] 

我有两个不同的数据集在这里。我不知道最终会得到多少行,正如你所看到的,第一对值也是OID的一部分。

很好地打印它们明显地整理它,但如果我想在每一行使用它们一次,分割它的最佳方法是什么?

我可能会多达八组不同,我将不得不一起工作的价值观,所以每条线将是例如:

8650, QNewsAK, 46835255, 8442357, 0 

哪些是“ID”,“姓名”,“大小“,”空闲“和”状态“,其中状态通常不为零。

回答

4

下面是使用group_by做繁重工作的出发点:

SNMP_RESPONSE = [ 
    '[name=1.3.6.1.4.1.15248.2.5.1.3.1.1.8650, value=8650 (INTEGER)]', 
    '[name=1.3.6.1.4.1.15248.2.5.1.3.1.1.8651, value=8651 (INTEGER)]', 
    '[name=1.3.6.1.4.1.15248.2.5.1.3.1.2.8650, value=QNewsAK (OCTET STRING)]', 
    '[name=1.3.6.1.4.1.15248.2.5.1.3.1.2.8651, value=QSuite4AK (OCTET STRING)]', 
    '[name=1.3.6.1.4.1.15248.2.5.1.3.1.3.8650, value=46835255 (INTEGER)]', 
    '[name=1.3.6.1.4.1.15248.2.5.1.3.1.3.8651, value=11041721 (INTEGER)]', 
    '[name=1.3.6.1.4.1.15248.2.5.1.3.1.4.8650, value=8442357 (INTEGER)]', 
    '[name=1.3.6.1.4.1.15248.2.5.1.3.1.4.8651, value=5717570 (INTEGER)]', 
    '[name=1.3.6.1.4.1.15248.2.5.1.3.1.5.8650, value=0 (INTEGER)]', 
    '[name=1.3.6.1.4.1.15248.2.5.1.3.1.5.8651, value=0 (INTEGER)]', 
] 

SNMP_RESPONSE.group_by{ |s| s.split(',').first[/\d+$/] } 

将返回:

{ 
    "8650" => [ 
     [0] "[name=1.3.6.1.4.1.15248.2.5.1.3.1.1.8650, value=8650 (INTEGER)]", 
     [1] "[name=1.3.6.1.4.1.15248.2.5.1.3.1.2.8650, value=QNewsAK (OCTET STRING)]", 
     [2] "[name=1.3.6.1.4.1.15248.2.5.1.3.1.3.8650, value=46835255 (INTEGER)]", 
     [3] "[name=1.3.6.1.4.1.15248.2.5.1.3.1.4.8650, value=8442357 (INTEGER)]", 
     [4] "[name=1.3.6.1.4.1.15248.2.5.1.3.1.5.8650, value=0 (INTEGER)]" 
    ], 
    "8651" => [ 
     [0] "[name=1.3.6.1.4.1.15248.2.5.1.3.1.1.8651, value=8651 (INTEGER)]", 
     [1] "[name=1.3.6.1.4.1.15248.2.5.1.3.1.2.8651, value=QSuite4AK (OCTET STRING)]", 
     [2] "[name=1.3.6.1.4.1.15248.2.5.1.3.1.3.8651, value=11041721 (INTEGER)]", 
     [3] "[name=1.3.6.1.4.1.15248.2.5.1.3.1.4.8651, value=5717570 (INTEGER)]", 
     [4] "[name=1.3.6.1.4.1.15248.2.5.1.3.1.5.8651, value=0 (INTEGER)]" 
    ] 
} 

散列可以进一步被操纵:

groups = SNMP_RESPONSE.group_by{ |s| s.split(',').first[/\d+$/] } 
values = groups.map{ |key, ary| ary.map{ |s| s[/value=(\S+)/, 1] } } 

values外观如:

01更
[ 
    [0] [ 
     [0] "8650", 
     [1] "QNewsAK", 
     [2] "46835255", 
     [3] "8442357", 
     [4] "0" 
    ], 
    [1] [ 
     [0] "8651", 
     [1] "QSuite4AK", 
     [2] "11041721", 
     [3] "5717570", 
     [4] "0" 
    ] 
] 

有点按摩给出:

puts values.map{ |a| a.join(', ') } 

,输出:

8650, QNewsAK, 46835255, 8442357, 0 
8651, QSuite4AK, 11041721, 5717570, 0 
+0

谢谢铁皮人 - 这正是我一直在寻找 - 许多感谢 – Scott