2016-08-01 56 views
1

我想通過循環讀取逐行讀取txt文件的命令輸出來解析Cisco show ip interface vrf all無法正確解析cisco cli命令輸出

輸出是:

IP Interface Status for VRF "default" 
loopback1, Interface status: protocol-up/link-up/admin-up, iod: 212, 
IP address: 10.1.0.1, IP subnet: 10.1.0.0/30 
... 

Ethernet1/1, Interface status: protocol-up/link-up/admin-up, iod: 278, 
    IP address: 10.0.0.1, IP subnet: 10.0.0.0/30 

IP Interface Status for VRF "TEST" 
Vlan99, Interface status: protocol-up/link-up/admin-up, iod: 147, 
    IP address: 172.16.0.1, IP subnet: 172.16.0.0/24 
    ... 
Vlan888, Interface status: protocol-up/link-up/admin-up, iod: 115, 
    IP address: 172.16.1.1, IP subnet: 172.16.1.0/24 
... 

等。

我只需要提取具有VLAN和子網的VRF。 例如從這個輸出,我應該有變量在每次迭代:

vrf -> vlan -> subnet (TEST -> 99 -> 172.16.0.0/24) 
vrf -> vlan -> subnet (TEST -> 888 -> 172.16.1.0/24) 

但我不從default vrf需要的信息,因爲它沒有任何的VLAN。

我寫了一些正則表達式來找到這個信息:

vrf = re.findall(r'VRF "(.*)"', line) 
    vlan = re.findall(r'Vlan(\d+)', line) 
    subnet= re.findall(r'IP address.*subnet:\s(.*)$', line) 

但我不知道怎麼不理,沒有VLAN的VRF的。

+0

你想得到什麼樣的最終結果? – nicael

+0

我需要在遍歷行時插入所有vrf和它們的vlan號碼和子網給mysql。 – Jegor

回答

0

您可以使用此表達式:

^(Vlan\d+).+[\n\r] 
.+?subnet:\ (.+) 


Python代碼:

import re 
rx = re.compile(""" 
    ^(Vlan\d+).+[\n\r] # capture Vlan, followed by digits at the beginning of line 
    .+?subnet:\ (.+) # match anything lazily, followed by subnet and capture the address 
    """,re.MULTILINE|re.VERBOSE) 

for match in rx.finditer(your_string_here): 
    print match.group(1) # Vlan99 
    print match.group(2) # the subnet ip 


a demo on regex101.com

+0

它正在工作,但我也需要提取vrf名稱。我試圖改變這個表達式:VRF \「(。*)」[\ n \ r] Vlan(\ d +)。+ [\ n \ r] 。+?子網:\(。+) vrf和第一個vlan和第一個子網,但是VRF上有兩個或更多的vlans – Jegor

+0

@Jegor:請提供一個確切的輸出然後(編輯你的原始問題,就是這樣)。 – Jan