Сокращение имени сетевого интерфейса (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 шт):

Автор решения: Exploit89
  1. У вас нет рабочей модели, т.к. не хватает модуля netmiko, но это не главное.
  2. Вам нужно поработать с форматированием строк:
    a = "GigabitEthernet0/1"  # есть какое-то значение (строка), которое выполучаете.
    start = a[:2]  # отделяем первые два символа Gi
    check = len(a)  # считаем длину всей строки
    check -= 15  # отнимаем длину строки слова GigabitEthernet
    end = a[-int(check):]  # отделяем конец, т.е. последние цифры
    print(start + end) 

выводим результат - первые 2 символа + любое кол-во символов на конце (т.к. вам неизвестно сколько и каких чисел будет в результате, но всегда будет одно и то-же кол-во в слове GigabitEthernet.

Таким образом вам нужно сделать условия для каждой строки.

Я привел пример очень расписанный, но можно это сделать более коротко.

Если у вас очень много строк - найдите зависимость (к примеру используются всегда одни и те же 4 слова разной длины), и на ее основе написать условный блок, который будет проверять - какие символы содержит строка или с каких начинается строка - и пусть функция отфильтровывает (отрезает/сокращает) получаемые строки как положено, согласно вашим прописанным условиям.

→ Ссылка
Автор решения: CrazyElf

Можно использовать регулярные выражения:

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
→ Ссылка