如何用Python3+Netmiko从F5设备输出提取最后一行数字值?
解决F5设备slot-id最后数字提取问题
问题分析
你当前代码的问题在于:每次匹配到含slot-id的行时,只是临时创建单元素列表k,没有持续收集所有slot-id数字,因此无法获取最后一个值;另外直接取行尾字符[-1]的方式不够稳妥,若数字是多位数(比如10)会直接出错,应该用正则精准提取数字。
修改方案
- 初始化一个列表,用来存储所有提取到的slot-id数字
- 用正则表达式匹配行中的数字,替代直接取行尾字符的操作
- 遍历完所有行后,取列表最后一个元素存入
slotnum变量
修改后的完整代码片段
import re from netmiko import Netmiko from multiprocessing.dummy import Pool as ThreadPool import time f_2 = open("f5ips.txt","r") multiple_device_list = f_2.readlines() def _slot_(nodeip): try: switch = { 'device_type': 'f5_ltm', 'ip': nodeip.strip(), 'username': 'user', 'password':"pass", "conn_timeout": 2} switch_connect = Netmiko(**switch) print(nodeip.strip() + " " + "is reachable") prompt_sw_axa = switch_connect.find_prompt() slice1 = (prompt_sw_axa.split(')')[0]) slice2 = [slice1.split("(")[1]] name = [(slice2[0])] print(name) except Exception as e: print(e) # 修复原代码中无效的写入语句,实际记录不可达IP with open("unreachable_f5.txt", "a") as f: f.write(nodeip.strip() + "\n") return output = switch_connect.send_command("show sys cluster field-fmt") print(name[0]) LINES = output.split("\n") # 初始化列表存储所有slot-id数字 slot_ids = [] for l1 in LINES: # 正则匹配slot-id后的数字,兼容多位数 match = re.search(r'slot-id\s+(\d+)', l1) if match: slot_num = match.group(1) slot_ids.append(slot_num) print(f"提取到slot-id: {slot_num}") # 获取最后一个slot-id数字并存储 if slot_ids: slotnum = slot_ids[-1] print(f"[{name[0]}] 最后一个slot-id数字: {slotnum}") # 这里可根据需求对slotnum做后续处理,比如写入结果文件 else: print(f"[{name[0]}] 未找到slot-id记录") switch_connect.disconnect() myPool = ThreadPool(100) myPool.map(_slot_, multiple_device_list) myPool.close() myPool.join()
关键改动说明
- 新增
slot_ids列表,持续收集所有匹配到的slot-id数字,避免临时变量覆盖 - 使用正则
r'slot-id\s+(\d+)'精准提取数字:\s+匹配任意空格,(\d+)捕获一个或多个数字,解决了行尾字符无法处理多位数的问题 - 遍历结束后通过
slot_ids[-1]获取最后一个元素,同时增加非空判断防止索引错误 - 修复原代码中异常处理里无效的文件写入语句,改为实际记录不可达IP
- 补充线程池的
map、close、join操作,确保多线程任务正常执行
内容的提问来源于stack exchange,提问作者harry838383
相关产品推荐
相关产品推荐

