Как разобрать вывод в Python и использовать его в цикле

Goroshek спросил: 28 апреля 2018 в 09:11 в: python

Мне нужно извлечь 'xe-1/2/0' из следующего выхода UPD.result:

interface xe-1/2/0.0;
interface ge-1/2/1.0;
interface lo0.0 {

(Это выводится из 'show config protocols ospf | match int ') из одного поля в списке.)


Я использую библиотеку netmiko для подключения к сетевым устройствам и поиска некоторых интерфейсов, которые участвуют в протоколе OSPF, затем я хочу проверить ошибки на этом интерфейсе.

import getpass
import sys
import time
import textfsm
import os
from tabulate import tabulate
import refrom netmiko import ConnectHandlerUSER = raw_input("Login:")
PASSWORD = getpass.getpass()
FILENAME = raw_input("Name of file with results:")
GETPATH= os.getcwd()
GETPATH2 = (GETPATH+'/IP-ADD.txt')
GETPATH3 = (GETPATH+'/template-desc.template')BOXES_IP = [line.strip() for line in open(GETPATH2, 'r')]
print(BOXES_IP)for IP in BOXES_IP:
    print('CONNECTION TO DEVICE {}'.format(IP))
    try:
       DEVICE_PARAMS = {'device_type': 'juniper_junos',
                        'ip': IP,
                        'username':USER,
                        'password':PASSWORD,
                        'verbose': True}
        with ConnectHandler(**DEVICE_PARAMS) as sss:
            sss.enable()            result = sss.send_command('show configuration protocols ospf| match int')
            hostname = sss.send_command('show configuration system host-name')
            print(result)
    except:
        print('CONNECTION TO DEVICE FAILS {}'.format(IP))
        continue    f = open(FILENAME+'.txt', 'a')
    for row in hostname:
        f.write(row)
    for row in result:
        f.write(row)
    f.close()    regex = re.compile(r'^(xe.[0-9].[0-9].[0-9])')
    results_list = []     b = open(FILENAME+'.txt', 'r')
    print b
    for line in b:
        match = regex.search(line)
        if not match: continue
        results_list.append(match.group())
    print results_list

Мне нужно разобрать вывод команды 'show configuration protocols ospf| match int' и найти xe (например, xe-0/0/1) и после этого введите команду 'show interface xe-*** extensive' и распечатайте результаты в файле.

Как я могу это сделать?

Я пытаюсь проанализировать выходной файл с компиляцией, но он не работает.

UPDATE.

print(result)

вывод:

interface lo0.0 {
interface xe-1/3/1.0;
interface ge-1/2/0.0;
interface xe-1/3/0.0;

Результат разделения

    for l in result.split("\n"):
    l = l.split(" ")
    print l[u'']
[u'', u'', u'', u'', u'interface', u'lo0.0', u'{']
[u'', u'', u'', u'', u'interface', u'xe-1/3/1.0;']
[u'', u'', u'', u'', u'interface', u'ge-1/2/0.0;']
[u'', u'', u'', u'', u'interface', u'xe-1/3/0.0;']
[u'']

2 ответа

Есть решение
Setop ответил: 28 апреля 2018 в 11:15

IMHO, regexp является чрезмерным и подвержен ошибкой для этой задачи. Я бы сделал что-то вроде:

result ="""interface xe-1/2/0.0;
interface ge-1/2/1.0;
interface lo0.0 {
"""for l in result.split("\n"):
    l = l.split(" ")
    if l[0] == "interface": # cause grep on "int"
        iface = l[1]
        if iface[0:3] == "xe-":
            arg=iface.split(".")[0]
            # do something with arg
            print(arg)

создает:

xe-1/2/0
Goroshek ответил: 28 апреля 2018 в 10:44
После того, как мы разделим список ("\ n"), получим следующее: a = [u '', u 'interface ge-1/2 / 0.0;', u 'interface ge-1/2 / 1.0;', u 'interface lo0.0 {', u' ']
Setop ответил: 28 апреля 2018 в 10:49
@Goroshek, возможно, но это не меняет ответ: пустые строки будут проигнорированы.
Goroshek ответил: 28 апреля 2018 в 10:59
Это не работает для меня сейчас, но я понимаю идею. Спасибо
Setop ответил: 28 апреля 2018 в 11:07
@Goroshek, если вы предоставите свой вклад, мы можем найти проблему
Goroshek ответил: 28 апреля 2018 в 01:12
Проверьте раздел UPDATE
zipa ответил: 28 апреля 2018 в 11:17

Если вы хотите использовать re, это должно сделать это:

import reoutput = '''interface xe-1/2/0.0;
interface ge-1/2/1.0;
interface lo0.0 {'''print(re.findall('xe-\d/\d/\d', output))
#['xe-1/2/0']

Чтобы получить желаемый результат, вы можете использовать:

for found in re.findall('xe-\d/\d/\d', output):
    print('show interface {} extensive'.format(found))
Goroshek ответил: 28 апреля 2018 в 11:03
получил это [u'xe-1/3/1 ', u'xe-1/3/0'] Не знаю, откуда эти символы '
Setop ответил: 28 апреля 2018 в 11:11
это не дает "ge" интерфейсов ...
zipa ответил: 28 апреля 2018 в 11:12
@Setop Первая строка вопроса гласит, что OP хочет только xe
zipa ответил: 28 апреля 2018 в 11:13
@Goroshek u'some_text' указывает только на то, что текст является unicode, вам не о чем беспокоиться (если он не вызывает ошибок позже в коде).