使用 Python 对 Cisco IOS CDP 邻居输出进行排序

问题描述 投票:0回答:0

我目前有一些 Python 代码来获取 Cisco IOS 的

show cdp neighbors
命令的输出并生成一个 CSV,然后我将其粘贴到 Excel 中,通过本地界面订购:
=SORTBY(I12:N38,LEFT(J12:J38,SEARCH("/",J12:J38)-1),1,MID(SUBSTITUTE(J12:J38,"/","^",2),SEARCH("^",SUBSTITUTE(J12:J38,"/","^",2))+1,2)+0,1)

为了简化事情,我一直在尝试模拟这种行为并在 Python 中订购 CSV,但运气不佳。我可以使用 natsorted() 或这个修改后的代码块对一个简单的接口列表进行排序(从 https://keepalives.wordpress.com/2013/06/05/sorting-cisco-interface-names 的评论中归功于 Evan -in-python/):

def cisco_interface_key(x):
    regex = re.compile(r'(?P<interface_type>[a-zA-Z]*)(?P<port>.*)')
    result = regex.search(x)
    if result:
        interface_type = result.group("interface_type")
        port = result.group("port")
        port_split = [int(z) for z in port.split("/")]
        port_split.insert(0,interface_type)
        return tuple(port_split)
    return 0

list1 = ['GigabitEthernet1/0/2', 'GigabitEthernet1/0/3', 'GigabitEthernet2/0/4', 'GigabitEthernet3/0/1', 'GigabitEthernet1/0/11']

list1 = sorted(list1, key=cisco_interface_key)
print(list1)

效果很好!如果你的信息只是接口,如果传递一个 dict 或 list 对象就会出错。

我正在尝试对字典或这样的列表进行排序:

list2 = ["Device ID,Local Intrfce,Holdtme,Capability,Platform,Port ID",
"MAC1,Gig 1/0/7,144,H P M,IP Phone,Port 1",
"MAC3,Gig 1/0/24,155,H P M,IP Phone,Port 1",
"MAC2,Gig 1/0/12,133,H P M,IP Phone,Port 1",
"MAC8,Gig 1/0/17,143,H P M,IP Phone,Port 1"]
listcsv = list(csv.reader(list2))
list3 = natsorted(listcsv, key = lambda row: row[1])

natsorted() 似乎在工作,尽管它会将我的标题放在文件的底部 - 不理想。这是我第一次接触'lambda',对它没有真正的了解。

有没有办法在使用 natsort 时跳过 CSV 标头,或者以其他方式将 dict/list 传递给 RegEx 函数?理想情况下,我更喜欢使用 RegEx,因为它不需要安装额外的库。

谢谢!

python cisco
© www.soinside.com 2019 - 2024. All rights reserved.