使用Netmiko结合TextFSM解析输出时,如何在不修改NTC模板的情况下处理错误并保留已匹配的数据?
我太懂你这个困扰了——NTC模板里的^. -> Error规则在模板开发调试时确实能帮着找问题,但到了实际环境里,厂商随便更个设备固件,输出的页眉、页脚或者某个字段格式变了(比如你例子里的28w4d这种长格式 uptime),直接就触发TextFSM错误,还把已经匹配到的好数据也丢了。手动改模板又要改一堆,更新NTC包还会被覆盖,完全是个恶性循环。
好在TextFSM本身就提供了处理这种情况的配置,不用碰原始模板就能解决,给你两个实用的方案:
方案1:手动加载模板,自定义TextFSM的错误行为
这个方法更灵活,不会影响全局配置,适合精准控制单条命令的解析逻辑:
核心思路是绕过parse_output的直接调用,手动加载NTC模板,创建TextFSM实例时把ErrorAction改成SKIP(跳过不匹配的行)或者WARN(跳过并打印警告),这样遇到不匹配的行时,解析器会直接忽略,继续处理后面的内容,同时保留已经匹配到的所有数据。
代码示例:
from ntc_templates import get_template from textfsm import TextFSM import io # 1. 加载NTC提供的对应模板 template_path = get_template('cisco_nxos', 'show ip eigrp neighbors') with open(template_path, 'r') as f: template_content = f.read() # 2. 创建TextFSM对象,设置错误行为为SKIP(跳过不匹配行) # 也可以用TextFSM.WARN,会打印哪一行不匹配的警告,方便排查但不中断解析 fsm = TextFSM(io.StringIO(template_content)) fsm.ErrorAction = TextFSM.SKIP # 3. 准备要解析的设备输出数据 device_output = """IP-EIGRP neighbors for process 65535 VRF default H Address Interface Hold Uptime SRTT RTO Q Seq (sec) (ms) Cnt Num 7 10.20.150.2 Po2001 12 03:44:02 20 200 0 10331 6 10.20.200.2 Po2000 14 03:44:14 13 200 0 158157 5 10.40.1.1 Eth1/26 13 03:44:14 16 200 0 158164 4 10.50.2.1 Eth2/5 12 03:44:14 16 200 0 158166 3 10.50.1.1 Eth2/6 13 03:44:15 16 200 0 158165 2 10.50.3.1 Eth2/7 11 03:44:15 13 200 0 158167 1 10.20.5.2 Eth3/11 14 03:44:16 18 200 0 158158 0 10.20.6.2 Eth3/12 11 28w4d 14 200 0 158163""" # 4. 解析数据并整理成和parse_output一致的字典格式 parsed_rows = fsm.ParseText(device_output) final_result = [dict(zip(fsm.header, row)) for row in parsed_rows] print(final_result)
这个方案的好处是完全不碰原始NTC模板,NTC包更新后也不用重新改,代码可移植性拉满。
方案2:全局修改TextFSM的默认错误行为(谨慎使用)
如果你希望所有的TextFSM解析都自动跳过不匹配的行,不想每次都手动加载模板,可以用猴子补丁全局修改TextFSM的默认ErrorAction:
from ntc_templates.parse import parse_output from textfsm import TextFSM # 全局设置TextFSM遇到不匹配行时跳过,不报错 TextFSM.ErrorAction = TextFSM.SKIP # 然后正常使用parse_output即可 device_output = """[你的设备输出数据]""" result = parse_output(platform='cisco_nxos', command='show ip eigrp neighbors', data=device_output) print(result)
这个方法的优点是不用改原来的parse_output调用逻辑,省事;但缺点是全局生效,如果其他地方依赖TextFSM的默认报错行为(比如调试新模板时需要发现不匹配的行),可能会影响调试效率。
补充说明:TextFSM的ErrorAction可选值
TextFSM提供了三种错误处理行为:
TextFSM.ERROR:默认行为,遇到不匹配的行直接抛出TextFSMError,终止解析TextFSM.SKIP:跳过不匹配的行,继续解析后续内容,不产生任何提示TextFSM.WARN:跳过不匹配的行,同时在控制台打印警告信息(告知哪一行不匹配),方便你后续排查模板需要优化的地方,但不会中断解析
这样不管设备输出有多少不匹配的行,你都能拿到所有能匹配上的有效数据,完全不用修改原始的NTC模板,完美解决你说的所有痛点~
备注:内容来源于stack exchange,提问作者AnarchistMiracle

