TextFsm简介
谷歌开发的解析网络配置的python包,通过编写解析模板可以将网络配置进行格式化,提取出需要的数据,甚至直接输出成表格。
这种模板的编写可以将解析逻辑与python代码分离,而且可以重复使用,极大的提高了网络工程师写脚本的效率。
一个简单的TextFSM解析文本程序主要包括了三个部分的内容,待解析的文本,模板,和调用TextFSM库进行解析的python代码
有限状态机
有限状态机简写未FSM(Finite State Machine),可以理解为一个引擎模板,根据当前状态与事件输入,判断下一步干什么。现态,条件(事件),动作,次态
TextFSM概念以及底层逻辑
一个TextFSM模板的基本组成:
1、定义需要提取字段的Value
2、定义解析的状态State
3、定义每个状态里的进行匹配提取以及相应动作的rule
(一个完成的rule由前半段匹配提取规则和后半段rule action 组成 rule action不写的时候会有默认值)
类似逻辑(伪代码)
records=[]
record={}
for line in show_text:
L_action,r_action,s_action=action_in_rule
do actions
record.update(**values_get_by_rule)
Value的定义
value是定义要提取的字段名和其正则,以及一些options(可选项,约束或者动作),简单理解每个value定义了表格中表头的一个字段
其格式如下:
Value [option[,option....]] name regex
name是字段名称,不能用option的。
Value的regex
regex即提取字段的规则,用的是正则表达式,一定写在括号里。
关于正则表达式的详细程度,具体问题具体分析,可以精细,也可以粗颗粒度
通过相应的位置粗颗粒度的可以达到比较好的效果,但是如果对于位置把控不好,可以导致提取效果不佳,初学者可以先尝试粗颗粒度,用\S \s等来写
Value [option[,option...]] name regex
Value的option
option是对字段的一些补充说明,比如约束,填充等,是关键字,不可在name中使用。
示例:
State的定义
有限状态机中的状态,理解为当前解析所处的状态环节
每个textfsm的模板中,一定以Start开始,隐式的包含了一个EOF状态(读取到文本的最后)
大部分简单的就是一个Start状态即可解决问题
一个state内一定是含有1-N个rule的。
Rule是解析的核心,用于驱动整个模板进行流转的奥秘所在。比如记录一条数据或者进行状态转移
state的写法如下:
stateName
^rule #注意,前面必须得有一个空格
^rule
....
Sate多个state
有限状态机的状态,理解为当前解析所处的状态环节
Rule
格式:^regex [->action]
Rule是提取信息以及驱动texfsm的核心之一
讲述在一个state内部匹配到某种正则后,该如何采取何种action,比如记录数据或者进行状态转移。
rule必须以空格或者符合"^"开通,regex既需要匹配的正则表达式,action是匹配后成功执行的行为。
在正则表达式regex中,用$ValueName或的形式来表示之前定义的value变量,解析的时候,这些变量表示会被他们的正则表达式替换用于规则匹配。可以用“$$"显示的指出正则表达式的结尾。
作用:actions作用是指定匹配成功后继续执行的行为
位置:actions写在匹配规则rule的后面,用符合”>"来与前面的匹配规则隔离
形式和分类:actions的呈现形式一般是“LRS":
每一个状态会包含一个或者多个rule,TextFSM在解析的过程中会和这些rule进行匹配
TextFSM的匹配规则过程:
1、读取一行输入文本内容,与当前的state中的rule进行逐个匹配;
2、如果与某规则rule匹配成功,如果rule中有变量提取的定义,则提取变量,保存到匹配的变量,然后这姓rule后指定的action;
3、对该行输入的文本的操作结束后,回到步骤1;
直接提取
以提取版本号,bootflash等数据,整段配置只有一条数据,整段配置返回一条数据(一个长度为1的list)
所有的信息在一行的多条数据提取
各种表类数据,如mac,arp,端口(brief),feature等等
部分textfsm规则说明
^$$ 代表换行,等同\n,\r