2016-08-01 9 views
1

Ich versuche, Cisco show ip interface vrf all Befehl Ausgabe von TXT-Datei durch Lesen von Zeile für Zeile in Schleife zu analysieren.Kann Cisco CLI Befehl Ausgabe nicht korrekt analysieren

Die Ausgabe lautet:

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 
... 

Und so weiter.

Ich muss nur VRF extrahieren, die VLAN und Subnetz haben. Zum Beispiel dieser Ausgabe sollte ich Variablen in jeder Iteration:

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

Aber ich brauche keine Informationen aus default vrf, weil sie keine VLans hat.

Ich schrieb einige reguläre Ausdrücke diese Informationen zu finden:

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

Aber ich weiß nicht, wie VRFs ohne vlans zu ignorieren.

+0

Was ist das Endergebnis, das Sie bekommen möchten? – nicael

+0

Ich muss alle Vrfs und ihre Vlan-Nummern und Subnetze in mysql einfügen, während ich durch die Zeilen iteriere. – Jegor

Antwort

0

können Sie diesen Ausdruck verwenden:

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


In Python Code:

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 See.

+0

Es funktioniert, aber ich brauche auch vrf name extrahieren. Ich habe versucht, diesen Ausdruck zu ändern: VRF \ "(. *)" [\ N \ r] Vlan (\ d +). + [\ N \ r] . +? Subnetz: \ (. +) Aber es nur finden Vrf und erste VLAN und erste Subnetz, aber es gibt zwei oder mehr VLANs auf VRF – Jegor

+0

@Jegor: Bitte geben Sie eine genaue Ausgabe dann (bearbeiten Sie Ihre ursprüngliche Frage, das ist). – Jan

Verwandte Themen