[英]Python - regex to extract IP and Mask from snmp walk output
我正在努力使用正則表達式從snmp walk輸出中提取IP和子網掩碼信息。 以下是輸出的外觀。
[<SNMPVariable value='255.255.255.0' (oid='iso.3.6.1.2.1.4.21.1.11.10.10.2.0', oid_index='', snmp_type='IPADDR')>, <SNMPVariable value='255.255.255.192' (oid='iso.3.6.1.2.1.4.21.1.11.10.0.0.0', oid_index='', snmp_type='IPADDR')>, <SNMPVariable value='255.255.255.0' (oid='iso.3.6.1.2.1.4.21.1.11.10.10.10.0', oid_index='', snmp_type='IPADDR')>, <SNMPVariable value='255.255.255.252' (oid='iso.3.6.1.2.1.4.21.1.11.10.11.0.0', oid_index='', snmp_type='IPADDR')>,
我已經將輸出組織在不同的行中,因此很容易理解(我的代碼中的實際輸出是上面的沒有行的輸出):
[<SNMPVariable value='255.255.255.0' (oid='iso.3.6.1.2.1.4.21.1.11.10.10.2.0', oid_index='', snmp_type='IPADDR')>,
<SNMPVariable value='255.255.255.192' (oid='iso.3.6.1.2.1.4.21.1.11.10.0.0.0', oid_index='', snmp_type='IPADDR')>,
<SNMPVariable value='255.255.255.0' (oid='iso.3.6.1.2.1.4.21.1.11.10.10.10.0', oid_index='', snmp_type='IPADDR')>,
<SNMPVariable value='255.255.255.252' (oid='iso.3.6.1.2.1.4.21.1.11.10.11.0.0', oid_index='', snmp_type='IPADDR')>,
因此每塊之間,我們有子網掩碼(值= '255.255.255.0')和IP地址(OID = 'iso.3.6.1.2.1.4.21.1.11。10.10.2.0')
我需要提取該信息並將其保存在數組/列表中,以便它看起來像這樣:
(10.10.2.0/255.255.255.0, 10.0.0.0/255.255.255.192, and so on ...)
我相信正則表達式將是最好的解決方案,但盡管經過了數小時的研究和嘗試,我似乎無法找到解決方案。
這是我到目前為止:
<some code omitted ..>
# contains SNMP output displayed above
print snmp_output
str_result = ''.join(str(snmp_output))
regex = re.findall(r"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b", str_result)
print regex
它給了我這個輸出:
['255.255.255.0', '3.6.1.2', '1.4.21.1', '11.10.10.2', '255.255.255.192', '3.6.1.2', '1.4.21.1', '11.10.0.0', '255.255.255.0', and so on ...]
我想第一步就是走出去只給我掩碼和IP而不是#s介於兩者之間。
任何幫助將不勝感激。
謝謝達蒙
編輯:
for item in system_items:
print '{oid}.{oid_index} {snmp_type} = {value}'.format(
oid=item.oid,
oid_index=item.oid_index,
snmp_type=item.snmp_type,
value=item.value
您可以使用以下正則表達式:
value='([\d.]+)'\s*\(oid='iso.*?\.(\d+\.\d+.\d+.\d+)'
在python中:
>>> import re
>>> str = r"[<SNMPVariable value='255.255.255.0' (oid='iso.3.6.1.2.1.4.21.1.11.10.10.2.0', oid_index='', snmp_type='IPADDR')>, <SNMPVariable value='255.255.255.192' (oid='iso.3.6.1.2.1.4.21.1.11.10.0.0.0', oid_index='', snmp_type='IPADDR')>, <SNMPVariable value='255.255.255.0' (oid='iso.3.6.1.2.1.4.21.1.11.10.10.10.0', oid_index='', snmp_type='IPADDR')>, <SNMPVariable value='255.255.255.252' (oid='iso.3.6.1.2.1.4.21.1.11.10.11.0.0', oid_index='', snmp_type='IPADDR')>,"
>>> re.findall(r"value='([\d.]+)'\s*\(oid='iso.*?\.(\d+\.\d+.\d+.\d+)'", str)
# => [('255.255.255.0', '10.10.2.0'), ('255.255.255.192', '10.0.0.0'), ('255.255.255.0', '10.10.10.0'), ('255.255.255.252', '10.11.0.0')]
然后你可以根據需要使用元組並將它們格式化為字符串。
要在你的問題中獲得輸出:
>>> import re
>>> regex = re.compile(r'(?:\d+\.){3}\d+$')
>>> tuple('{}/{}'.format(regex.search(item.oid).group(0), item.value)
... for item in system_items)
我沒有安裝PySNMP
,但這是一個測試:
>>> class SNMPVariable(object):
... def __init__(self, value, oid):
... self.value = value
... self.oid = oid
...
>>> s1 = SNMPVariable('255.255.255.0', 'iso.3.6.1.2.1.4.21.1.11.10.10.2.0')
>>> s2 = SNMPVariable('255.255.255.252', 'iso.3.6.1.2.1.4.21.1.11.10.11.0.0')
>>> system_items = [s1, s2]
>>> tuple('{}/{}'.format(regex.search(item.oid).group(0), item.value)
... for item in system_items)
...
('10.10.2.0/255.255.255.0', '10.11.0.0/255.255.255.252')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.