使用Google TextFSM解析NXOS「show ip community-list」输出失败求助
问题分析与解决方案
我看了你的TextFSM模板和设备输出,问题主要出在几个匹配细节上,咱们一步步来修正:
核心问题点
- TYPE匹配不匹配:你的模板里写的是
(Standard|Extended),但设备输出里用的是Expanded而非Extended,这直接导致第一行完全匹配失败。 - CLNAME正则逻辑错误:
(\D+)仅匹配非数字字符,但你的列表名称ROUTES_CL1包含数字,这个正则会只截取到ROUTES_CL,漏掉后面的数字部分。 - 未处理带引号的社区值:设备输出里存在带双引号的条目(比如
"11111:10000"),你的正则没有处理引号,会导致ASNUM和TAGNUM匹配失败。 - 状态流转未覆盖行结构差异:有的社区列表表头和条目在同一行(比如Expanded那行),有的是表头单独一行后接多行条目,你的模板没覆盖这种同一行的场景。
修正后的TextFSM模板
Value TYPE (Standard|Expanded) Value CLNAME (\S+) Value SEQ (\d+) Value ACTION (permit|deny) Value ASNUM (\d+) Value TAGNUM (\d+) Start ^${TYPE}\s+Community\s+List\s+${CLNAME}\s+${SEQ}\s+${ACTION}\s+"?${ASNUM}:${TAGNUM}"?\s* -> Record ^${TYPE}\s+Community\s+List\s+${CLNAME}\s* -> CommunitySection CommunitySection ^\s+${SEQ}\s+${ACTION}\s+"?${ASNUM}:${TAGNUM}"?\s* -> Record
修正说明
- TYPE正则调整:把
Extended替换为Expanded,和设备输出的术语保持一致。 - CLNAME正则优化:改成
(\S+),匹配所有非空格字符,完美兼容带数字的列表名称。 - 引号兼容处理:在
ASNUM:TAGNUM前后添加"?,表示可选的双引号,不管条目带不带引号都能正常匹配。 - 状态流转优化:
- 第一个规则直接匹配表头和条目在同一行的情况,匹配后直接记录结果。
- 第二个规则匹配仅含表头的行,切换到
CommunitySection状态处理后续条目。 CommunitySection状态专门处理换行后的独立条目,匹配后记录结果。
测试效果
用这个模板解析你的设备输出,会得到以下结构化结果:
[ {'TYPE': 'Expanded', 'CLNAME': 'ROUTES_CL1', 'SEQ': '1', 'ACTION': 'permit', 'ASNUM': '11111', 'TAGNUM': '10000'}, {'TYPE': 'Standard', 'CLNAME': 'ROUTES_CL2', 'SEQ': '1', 'ACTION': 'permit', 'ASNUM': '11111', 'TAGNUM': '10000'}, {'TYPE': 'Standard', 'CLNAME': 'ROUTES_CL2', 'SEQ': '2', 'ACTION': 'permit', 'ASNUM': '22222', 'TAGNUM': '10000'}, {'TYPE': 'Standard', 'CLNAME': 'ROUTES_CL2', 'SEQ': '3', 'ACTION': 'permit', 'ASNUM': '33333', 'TAGNUM': '10000'} ]
内容的提问来源于stack exchange,提问作者netkool
相关产品推荐
相关产品推荐

