TextFSM 使用方法

  1. 语法介绍
    1. Line Action
    2. Record Action
    3. State Transition
    4. Error Action
  2. 常用写法
    1. 只有需要单一条目
    2. 多条记录
    3. 数组记录
    4. 不规则记录
    5. 转移状态既要记录又要转移

网络工程师往往需要使用自动化的处理工具来减轻负担。其中对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