网络工程师往往需要使用自动化的处理工具来减轻负担。其中对CLI的输出进行解析然后获取有效信息就是其中的自动化的关键。
TextFSM是Google发起的开源项目, 它的官方介绍Wiki里面介绍了几个基本使用方式。
这里是英文对网络工程师自动化的一些介绍。也有一些TextFSM的使用案例和介绍。
更多的使用案例在ntc-templates里面
语法介绍
文件后缀名称为 .textfsm
文件最基本的形态
Value name regex
Start
^Rule
其中Value的格式如下
Value [option,[option...]] name regex
Value 代表的是定义名称,必须的
Options
Filldown向下保留, 如果Record的时候Value的值为空,那么就取上一个Record中的值Fillup向上保留, 如果Record的时候Value值为空,那么就取下一个Record中的值Required表示为必须值,如果没有就不会记录List代表Value是数组类型Key没啥用
name 名称使用大写加下划线
regex 要获取的正则表达式
Start是状态机的起始,必须要有,对应的EOF是文件的末尾,可以隐藏掉。
Rule 必须以两个空格加一个^开头作为起始,是对单行的正则表达式的匹配,要匹配的Value值用${name}的方式包含。
Rule的结尾可以用 -> Action 的方式给出对应的动作,这个在原文中叫做Action in rules
Action 有三种:
L - Line Action对input输入的动作R - Record Action对记录的动作S - State Transition对状态的转行
他们的连接方式是 -> L.R S
Line Action
Line Action 包含两个动作:
Next这个是默认动作,表示读取读取下一行,并且从此状态机的头部开始重新匹配Continue这个动作表示依旧保留这一行的读取状态,并且继续下一条Rule的匹配
其实就是Next从头开始匹配下一行,Continue是对匹配了的继续往下走
Record Action
Record Action 包含了四个动作
NoRecord默认动作, 不做记录Record所有值被记录写入下来,然后进入下一条记录Clear清理掉除 Filldown 的所有值Clearall清理掉所有值
State Transition
改变状态机
当匹配到之后,下一条将会到转到对应的状态下,并且在这个状态下重复。
需要注意的是状态不能与 Continue连用。
Error Action
还有一个特殊的 Error Action,它会停止并且抛出异常textfsm.parser.TextFSMError
语法如下:
^regex -> Error [word|"string"]
常用写法
todo
只有需要单一条目
对于只需要一条记录就可以解决的问题
多条记录
数组记录
TODO
不规则记录
有状态转移,并且是最后一块,状态转移也不是必须的,比如下面的情况:
GigabitEthernet0/0/1 has 1 neighbors:
Neighbor index : 1
Chassis type :macAddress
Chassis ID :f55f-c2c5-e180
MED Device information
SoftwareRev :12.2(55)SE7
Model name :WS-C2960S-48LPS-L
GigabitEthernet0/0/2 has 1 neighbors:
Neighbor index : 1
Chassis type :macAddress
Chassis ID :f55f-c2c5-e180
GigabitEthernet0/0/3 has 1 neighbors:
Neighbor index : 1
Chassis type :macAddress
Chassis ID :f55f-c2c5-e180
MED Device information
SoftwareRev :12.2(55)SE7
Model name :WS-C2960S-48LPS-L
那么可以通过接口那一行来记录,并且Continue然后再记录下现在的接口名称
Value INTF (\S+)
Value NUM (\d+)
Value MED (\S+)
Start
^.* has \d+ neighbors: -> Continue.Record
^${INTF} has ${NUM}
$MED Device -> Med
Med
^\s+Model name\s+:${MED} -> Start
很巧妙的逆向思维。
转移状态既要记录又要转移
System Power Information (Power 1 - OFFLINE)
----------------------------------------------------------------
System Power Information (Power 2 - ONLINE)
----------------------------------------------------------------
Status: Online
Description:
Work Status: Normal
Power in: Normal
比如这个例子,需要通过状态转移来记录,但是又需要记录状态转移的信息,那么可以通过Continue来实现
以下textfsm为简化后的示例:
Value POWER_ID (\d+)
Value STATUS (\w+)
Value DESCRIPTION (\S+)
Value WORK_STATUS (\S+)
Value POWER_IN (\S+)
Start
^System\s+Power\s+Information\s+\(Power\s+${POWER_ID}\s+-\s+${STATUS}\) -> Long_Power_Info
Long_Power_Info
^System\s+Power -> Continue.Record
^System\s+Power\s+Information\s+\(Power\s+${POWER_ID}\s+-\s+${STATUS}\)
^\s*Description:\s+${DESCRIPTION}
^\s*Work\s+Status:\s+${WORK_STATUS}
^\s*Power\s+in:\s+${POWER_IN} -> Record Start
通过在状态里面的Continue.Record来实现
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 365433079@qq.com