2010-04-15 4 views
1

J'ai quelques informations de retour d'un commutateur LAN comme ci-dessousextrait de python de sortie de commutation

Vlan 1 is administratively down, line protocol is down 
Vlan 2 is up, line protocol is up 
    Helper address is 192.168.0.2 
Vlan 3 is up, line protocol is up 
    Helper address is not set 
Vlan 4 is up, line protocol is up 
    Helper address is 192.168.0.2 
Vlan 5 is down, line protocol is down 
    Helper address is 192.168.0.2 
Vlan 6 is down, line protocol is down 
    Helper address is not set 
    Helper address is not set 

Et la sortie, je suis en train de se

Vlan 1,admin down,n/a 
Vlan 2,up/up, 192.168.0.2 
Vlan 3, up/up, not set 
Vlan 4, up/up, 192.168.0.2 
Vlan 5, down/down, 192.168.0.2 
Vlan 6, down/down, not set 

Ainsi, l'aide ne soit pas toujours là (ligne 1) parfois il est défini parfois il n'est pas, parfois il y a deux lignes (dernier Vlan - j'ai besoin seulement 1)

et le Vlan peut avoir des états d'admin vers le bas, haut/haut, haut/bas (pas ici) et vers le bas. Donc, en utilisant Python et pexpect, je peux obtenir la sortie ci-dessus, mais j'ai du mal à analyser les lignes consécutives. J'ai essayé d'énumérer et ensuite j'utilise la touche + 1 pour la ligne suivante, mais le fait qu'il puisse y avoir 0,1 ou 2 lignes suivant le Vlan me visse. Des idées s'il vous plaît?

Répondre

0

Différencier entre les lignes d'intérêt (qui commencent par « Vlan », ou non):

for line in lines: 
    if line.startswith("Vlan"): 
     # parse Vlanline 
     # ... 
    else: 
     # parse data from helper line 
     # ... 
0

est ici une façon,

import re  
data=open("file").read() 
r=re.split("\n[^ \t]+",data) 
for i in r: 
    print "-->",i.split("\n") 

$ ./python.py 
--> ['Vlan 1 is administratively down, line protocol is down '] 
--> [' 2 is up, line protocol is up ', ' Helper address is 192.168.0.2 '] 
--> [' 3 is up, line protocol is up ', ' Helper address is not set '] 
--> [' 4 is up, line protocol is up ', ' Helper address is 192.168.0.2 '] 
--> [' 5 is down, line protocol is down ', ' Helper address is 192.168.0.2 '] 
--> [' 6 is down, line protocol is down ', ' Helper address is not set ', ' Helper address is not set', ''] 

maintenant vous pouvez manipuler chaque élément, car ils sont déjà regroupées

+0

cela a fonctionné avec un peu de peaufinage de l'entrée - il peut y avoir 0,1 ou 2 lignes d'assistance – user317225

1
import re 

x=""" 
Vlan 1 is administratively down, line protocol is down 
Vlan 2 is up, line protocol is up 
    Helper address is 192.168.0.2 
Vlan 3 is up, line protocol is up 
    Helper address is not set 
Vlan 4 is up, line protocol is up 
    Helper address is 192.168.0.2 
Vlan 5 is down, line protocol is down 
    Helper address is 192.168.0.2 
Vlan 6 is down, line protocol is down 
    Helper address is not set 
    Helper address is not set 
""" 

x=x.replace(" is administratively down, line protocol is down ",", admin down, n/a") 
x=x.replace(" line protocol is ","") 
x=x.replace(" is down,",", down/") 
x=x.replace(" is up,",", up/") 
x=re.sub("(?:\s*Helper address is (.*))+",", \\1",x) 

print x 

Vlan 1, admin down, n/a 
Vlan 2, up/up, 192.168.0.2 
Vlan 3, up/up, not set 
Vlan 4, up/up, 192.168.0.2 
Vlan 5, down/down, 192.168.0.2 
Vlan 6, down/down, not set 
0

ghostdog m'a donné une idée à la solution

D'abord, j'énuméré la table dans un dictionnaire Ensuite, l'étape à travers elle. Si la ligne a commencé avec VLAN je pourrais alors tester la ligne + 1 etc pour voir si elle était une ligne d'aide

puis sortie tout comme une ligne et couper en tranches comme je avais besoin

pas la manière la plus propre, mais fonctionne et merci à tous pour votre aide