python - 有没有办法在 TextFSM 的状态更改中继续使用同一行?
问题描述
我知道我不能将状态转换与 continue 语句结合起来。
我正在尝试使用 ansible 解析网络配置,其中行的唯一明确的结尾是下一个的开头。
例如,我想解析如下配置:
line vty 0 4
exec-timeout 30 0
authorization exec MIRADIUS
accounting connection MIRADIUS
accounting exec MIRADIUS
login authentication MIRADIUS
line vty 5 16
access-class 95 in vrf-also
exec-timeout 30 0
authorization exec MIRADIUS
accounting connection MIRADIUS
accounting exec MIRADIUS
login authentication MIRADIUS
history size 25
transport input ssh
line vty 15 116
access-class 95 in
exec-timeout 30 0
authorization exec MIRADIUS
accounting connection MIRADIUS
accounting exec MIRADIUS
login authentication MIRADIUS
history size 25
我正在使用的模板:
Value Required LINE (\d+\s+\d+)
Value vtyAcl (\d+|\w+)
Value aclDir (\w+)
Value vrfAlso (\w+-\w+)
Start
^\s+access-class\s+${vtyAcl}\s+${aclDir}\s+${vrfAlso}.*$$
^\s+access-class\s+${vtyAcl}\s+${aclDir}.*$$
^line vty ${LINE}.*$$ -> Continue.Record
因此,我必须知道我完成vty 0 4的唯一确定方法是vty 5 16启动。
那么,为了保存新的vty,是否可以继续使用该行?目前我的模板正在将上一行的配置保存在下一行中。我无法知道最后一行的可能性。
Current result:
[
{
"LINE": "0 4",
"aclDir": "",
"vrfAlso": "",
"vtyAcl": ""
},
{
"LINE": "5 16",
"aclDir": "",
"vrfAlso": "",
"vtyAcl": ""
},
{
"LINE": "15 116",
"aclDir": "in",
"vrfAlso": "vrf-also",
"vtyAcl": "95"
}
]
Desired Result:
[
{
"LINE": "0 4",
"aclDir": "",
"vrfAlso": "",
"vtyAcl": ""
},
{
"LINE": "5 16",
"aclDir": "in",
"vrfAlso": "vrf-also",
"vtyAcl": "95"
},
{
"LINE": "15 116",
"aclDir": "in",
"vrfAlso": "",
"vtyAcl": "95"
}
]
更新:这里是针对此特定问题的解决方案的更新。谢谢。
Value Required LINE (\d+\s+\d+)
Value vtyAcl (\d+|\w+)
Value aclDir (\w+)
Value vrfAlso (\w+-\w+)
Start
^line vty -> Continue.Record
^\s+access-class\s+${vtyAcl}\s+${aclDir}\s+${vrfAlso}.*$$
^\s+access-class\s+${vtyAcl}\s+${aclDir}.*$$
^line vty ${LINE}.*$$
解决方案
我一直在寻找同一个问题的答案,但没有找到(只找到你的问题:))。AFAIK:
- TextFSM 不支持 Lookahead/Lookbehind 正则表达式功能。
- 正如您已经写的那样,TextFSM 不支持 Record+Continue(状态更改),正如他们的文档中所述:“请注意,继续操作不接受状态转换。这确保了状态机是无循环的。”
- 如果在“line vty X Y”行之前有一个空字符串(或任何其他信息块的分隔符),我们可以使用 TextFSM 的状态。
我现在使用什么解决方法 - 因此我使用了几个模板,模板提取 VTY 编号和此行的 ONE 参数。然后将结果组合在一起。
但是在您的情况下,每个“line vty X Y”块只有一个“有趣”行,并且该行不是“line vty X Y”块中的最后一行,因此您可以使用正确的正则表达式(我稍微更正了您的模板- vrf 也“可能”或“可能不”存在)和一点 TextFSM 技巧。:)
Value Required LINE (\d+\s+\d+)
Value vtyAcl (\d+|\w+)
Value aclDir (\w+)
Value vrfAlso (\w+-\w+)
Start
^line vty ${LINE}.*$$
^\s+access-class\s+${vtyAcl}\s+${aclDir}\s*(${vrfAlso})?.*$$ -> Record
^.* -> Record
EOF
在这里,我们使用“^.* -> Record”来记录没有“interesting”字符串的行。
你会得到你想要的结果(我想):
LINE vtyAcl aclDir vrfAlso
------ -------- -------- ---------
0 4
5 16 95 in vrf-also
15 116 95 in
不幸的是,就我而言,我有多个“有趣”的字符串,它们可能是一个块中的最后一个,所以它对我不起作用。:(
更新:我无意中发现了 TextFSM 的展望方式。它让我知道如何为我的任务找到解决方案,这里描述了主要思想:https ://github.com/google/textfsm/issues/22
推荐阅读
- mysql - 带有关联的活动记录查询
- java - 致命异常:调用 Camera.release() 后正在使用 java.lang.RuntimeException 摄像头
- django - 要更改的 Django 查询集值并以纯 txt 副本发送给用户
- mongodb - Mongodb deleteMany,如何节省磁盘使用量?
- ios - AVFoundation 没有读取特定类型的条形码
- c - 将文本文件中的双精度数据复制到 C 中的数组中
- javascript - 使用带有元素 childNodes.length 的 while 循环直到它等于指定的数字不起作用(while 循环无法退出)
- iphone - Htaccess - 将 %23 转换为 #
- android - 如何通过 Volley 解析嵌套的 Json 对象?
- google-sheets - 公式编辑器可更好地概览嵌套函数