извлечение Python из вывода коммутатора - PullRequest
1 голос
/ 15 апреля 2010

У меня есть информация от коммутатора локальной сети, как показано ниже

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

И вывод, который я пытаюсь получить

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

То есть помощник не всегда есть (строка 1), иногда он установлен, иногда нет, иногда есть две строки (последний Vlan - мне нужна только 1)

и Vlan может иметь состояния администратора вниз, вверх / вверх, вверх / вниз (не здесь) и вниз вниз.

Таким образом, используя Python и pexpect, я могу получить приведенный выше вывод, но мне трудно разобрать последовательные строки. Я попытался перечислить, а затем использовать клавишу + 1 для следующей строки, но тот факт, что после Vlan винты меня может быть 0,1 или 2 строки. Есть идеи, пожалуйста?

Ответы [ 4 ]

1 голос
/ 15 апреля 2010
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 голосов
/ 15 апреля 2010

призрак дал мне ключ к решению

Сначала я перечислил таблицу в словарь Тогда шагните через это. Если линия началась с VLAN, я мог бы затем проверить линию + 1 и т. Д., Чтобы увидеть, была ли это вспомогательная линия

затем выведите их все одной строкой и нарежьте по мере необходимости

Не самый чистый способ, но работает и спасибо всем за помощь

0 голосов
/ 15 апреля 2010

вот один из способов,

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', '']

теперь вы можете манипулировать каждым элементом, так как они уже сгруппированы

0 голосов
/ 15 апреля 2010

Различие между интересующими линиями (которые начинаются с «Vlan»; или нет):

for line in lines:
    if line.startswith("Vlan"):
        # parse Vlanline
        # ...
    else:
        # parse data from helper line
        # ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...