Python - чтение определенных строк текста - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь искать файлы для конкретного текста.Затем напечатайте строку непосредственно перед строкой и все последующие строки, начинающиеся с определенного символа, в частности «пробел».

Вот пример файла, который я пытаюсь прочитать:

interface vlan 22
 ip address 10.10.2.1 255.255.255.0
 ip helper-address 10.10.44.1
 ip helper-address 10.10.44.2
!
interface vlan 23
 ip address 10.10.23.1 255.255.255.0
 ip helper-address 10.10.44.1
 ip helper-address 10.10.44.2
!

Когда я вижу «IP-адрес», я хочу напечатать строку непосредственно перед этим, а затем все элементы конфигурации в этом интерфейсе.

В настоящее время я читаю из каталога файлов и выводуконкретная информация из файлов.Вот код:

for file in glob.glob('*.log'):
with open(file) as search:
    with open(queryoutput,"a") as foutput:
        for line in search:
            line = line.rstrip()
            if hostcheck in line:
                hostentry = line.split("hostname ")[1]
                foutput.write("Subnet information below is from " + hostentry + "\n")
            elif ipaddress in line:
                foutput.write("Local Device: " + hostentry + "\n")
                foutput.write("Remote " + line + "\n")

Не все сетевые устройства будут указывать «интерфейс» в строке VLAN, поэтому я не хочу искать этот текст, и нет гарантии, что восклицательный знак будетпоследний пункт, хотя это весьма вероятно.Вот почему я ищу способ читать строки, основанные на «IP-адресе» и пробелах.

Я все еще новичок в Python и программировании в целом, но это выглядит как это может помочь.Я просто не до конца понимаю, как это будет работать.

Есть мысли о том, как мне это сделать?Также я пытаюсь использовать Python 3.x.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Вот образец из ciscoconfparse, рекомендованного выше.Это на самом деле очень полезно.Просто интересно, могу ли я как-то исключить все интерфейсы коммутатора для устройств.

     'interface FastEthernet0/7': ['spanning-tree portfast'],
 'interface FastEthernet0/8': ['switchport access vlan 300',
                               'switchport mode access',
                               'authentication event fail action next-method',
                               'authentication event server dead action reinitialize vlan 999',
                               'authentication host-mode multi-auth',
                               'authentication order dot1x mab',
                               'authentication priority dot1x mab',
                               'authentication port-control auto',
                               'mab eap',
                               'dot1x pae authenticator',
                               'spanning-tree portfast'],
 'interface FastEthernet0/9': ['switchport access vlan 300',
                               'switchport mode access',
                               'authentication event fail action next-method',
                               'authentication event server dead action reinitialize vlan 999',
                               'authentication host-mode multi-auth',
                               'authentication order dot1x mab',
                               'authentication priority dot1x mab',
                               'authentication port-control auto',
                               'mab eap',
                               'dot1x pae authenticator',
                               'spanning-tree portfast'],
 'interface GigabitEthernet0/1': [],
 'interface GigabitEthernet0/2': [],
 'interface Vlan1': ['no ip address', 'shutdown'],
 'interface Vlan300': ['ip address 172.22.0.1 255.255.255.0',
                       'ip helper-address 10.208.111.196',
                       'ip helper-address 10.208.111.195'],
 'interface Vlan310': ['ip address 172.31.200.1 255.255.255.0',
                       'ip access-group guest-restrictions in',
                       'ip helper-address 10.208.111.195',
                       'ip helper-address 10.208.111.196'],
 'interface Vlan500': ['ip address 172.19.0.2 255.255.255.248'],
0 голосов
/ 23 февраля 2019

Вероятно, было бы проще использовать библиотеку синтаксического анализа конфигурации Cisco, а не начинать с первых принципов.

Например, модуль ciscoconfparse делает вашу проблему такой же простой, как показано ниже,создание dict с каждым interface, сопоставленным со списком его элементов конфигурации.Для поиска других типов объектов достаточно изменить аргумент на find_objects.

. Предполагается, что мы имеем дело с файлом с именем test-config:

import pprint
from ciscoconfparse import CiscoConfParse

parse = CiscoConfParse("test-config", syntax="ios")

pprint.pprint({
    obj.text: [child.text.strip() for child in obj.children]
    for obj in parse.find_objects(r"interface")
})

Результат:

{'interface vlan 22': ['ip address 10.10.2.1 255.255.255.0',
                       'ip helper-address 10.10.44.1',
                       'ip helper-address 10.10.44.2'],
 'interface vlan 23': ['ip address 10.10.23.1 255.255.255.0',
                       'ip helper-address 10.10.44.1',
                       'ip helper-address 10.10.44.2']}

Редактировать: Что касается вашего дополнительного вопроса, вероятно, было бы целесообразно прочитать документацию и учебное пособие для модуля, который содержит, среди прочего, примеры как искатьдля записей с конкретными детьми .Чтобы добиться того, о чем вы просите, вы можете изменить вышеприведенное, используя функцию find_objects_w_child():

pprint.pprint({
    obj.text: [child.text.strip() for child in obj.children]
    for obj in parse.find_objects_w_child(
        parentspec=r"^interf", childspec=r"ip .*address"
    )
})
...