You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Netmiko结合TextFSM解析输出时,如何在不修改NTC模板的情况下处理错误并保留已匹配的数据?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:33:06