Сокращение имени сетевого интерфейса (netmiko parse command show cdp neighbors detail)
Подскажите пожалуйста как сократить имена сетевых интерфейсов, например GigabitEthernet1/2/44 -> Gi1/2/44
#!/usr/bin/env python3
from netmiko import ConnectHandler
import sys
import json
import textfsm
host = sys.argv[1]
device = {
"device_type": "cisco_ios",
"host": host,
"username": 'cisco',
"password": "pass",
"secret": "pass",
}
c = ConnectHandler(**device)
c.enable()
cdp1 = c.send_command('show cdp neigh det', use_textfsm=True)
for cdp in cdp1:
print(host,cdp['local_port'],cdp['destination_host'].split(".")[0],cdp['management_ip'],cdp['remote_port'],cdp['platform'].split("isco ")[1],sep='\t')
Вывод
sw-2-02 GigabitEthernet0/1 sw-03 10.0.1.5 GigabitEthernet2/2/20 WS-C6509-E
sw-2-02 FastEthernet0/17 sw-2-01 10.0.1.4 FastEthernet0/17 IE-3010-24TC
sw-2-02 GigabitEthernet0/2 sw-4-01 10.0.1.2 GigabitEthernet2/2/13 WS-C6503-E
sw-2-02 FastEthernet0/22 SEP64758B2196E4 10.0.2.7 Port 1 IP Phone 8841
Хочу что бы выглядело вот так
sw-2-02 Gi0/1 sw-03 10.0.1.5 Gi2/2/20 WS-C6509-E
sw-2-02 Fa0/17 sw-2-01 10.0.1.4 Fa0/17 IE-3010-24TC
sw-2-02 Gi0/2 sw-4-01 10.0.1.2 Gi2/2/13 WS-C6503-E
sw-2-02 Fa0/22 SEP64758B2196E4 10.0.2.7 Port 1 IP Phone 8841
Воспользовался методом @CrazyElf спасибо.
Рабочий скрипт
#!/usr/bin/env python3
from netmiko import ConnectHandler
import sys
import json
import textfsm
host = sys.argv[1]
device = {
"device_type": "cisco_ios",
"host": host,
"username": 'cisco',
"password": "pass",
"secret": "pass",
}
c = ConnectHandler(**device)
c.enable()
cdp1 = c.send_command('show cdp neigh det', use_textfsm=True)
rx = re.compile(r'(\w\w)\D+(.*)')
for cdp in cdp1:
lp = cdp['local_port']
rp = cdp['remote_port']
print(host,''.join(rx.findall(lp)[0]),cdp['destination_host'].split(".")[0],cdp['management_ip'],''.join(rx.findall(rp)[0]),cdp['platform'].split(" ")[1],sep='\t')
Ответы (2 шт):
- У вас нет рабочей модели, т.к. не хватает модуля netmiko, но это не главное.
- Вам нужно поработать с форматированием строк:
a = "GigabitEthernet0/1" # есть какое-то значение (строка), которое выполучаете.
start = a[:2] # отделяем первые два символа Gi
check = len(a) # считаем длину всей строки
check -= 15 # отнимаем длину строки слова GigabitEthernet
end = a[-int(check):] # отделяем конец, т.е. последние цифры
print(start + end)
выводим результат - первые 2 символа + любое кол-во символов на конце (т.к. вам неизвестно сколько и каких чисел будет в результате, но всегда будет одно и то-же кол-во в слове GigabitEthernet.
Таким образом вам нужно сделать условия для каждой строки.
Я привел пример очень расписанный, но можно это сделать более коротко.
Если у вас очень много строк - найдите зависимость (к примеру используются всегда одни и те же 4 слова разной длины), и на ее основе написать условный блок, который будет проверять - какие символы содержит строка или с каких начинается строка - и пусть функция отфильтровывает (отрезает/сокращает) получаемые строки как положено, согласно вашим прописанным условиям.
Можно использовать регулярные выражения:
import re
ether_list = ['GigabitEthernet0/1', 'FastEthernet0/17', 'GigabitEthernet0/2', 'FastEthernet0/22']
rx = re.compile(r'(\w\w)\D+(.*)')
for e in ether_list:
print(''.join(rx.findall(e)[0]))
Вывод:
Gi0/1
Fa0/17
Gi0/2
Fa0/22