前言:TextFSM是基于模板的状态机,用于将半格式的文本解析为表。它由Google开发,并托管在Google Code上。您还可以在GitHub上找到各种fork,例如对python 3的支持(我们将在以后使用)。它是高度可定制的,因为它与单独的模板定义一起使用,其中包含带有正则表达式的变量和规则。该库对于解析网络设备的任何基于文本的CLI输出非常有帮助。TextFSM可以在python脚本中使用,也可以作为独立工具使用。
目录
什么是TextFSM
TextFSM是一个Python模块,该模块实现了用于分析半格式文本的基于模板的状态机。最初是为了允许以编程方式访问由CLI驱动的设备(例如网络路由器和交换机)的输出所给出的信息而开发的,但是它可用于任何此类文本输出。
引擎接受两个输入-模板文件和文本输入(例如来自设备的CLI的命令响应),并返回包含从文本中解析出的数据的记录列表。
每个唯一结构化的文本输入都需要一个模板文件。该代码提供了一些示例,并鼓励用户自己开发。
通过开发模板文件池,脚本可以调用textFSM来解析来自各种来源的有用信息。也可以在同一数据上使用不同的模板,以创建不同的表(或视图)
细节
快速入门示例
- 安装
pip install textfsm==1.1.0
- 执行
该库直接可执行,可用于检查模板的语法并将输入与预期输出进# Run text through the FSM. # The argument 'template' is a file handle and 'raw_text_data' is a string. re_table = textfsm.TextFSM(template) data = re_table.ParseText(raw_text_data) # Display result as CSV # First the column headers print( ', '.join(re_table.header) ) # Each row of the table. for row in data: print( ', '.join(row) )
行比较。
如果作为软件包安装,它将在相关的python版本下。parser.py [--help] template [input_file [output_file]]
/usr/local/lib/pythonx.y/dist-packages/textfsm/parser.py
数据表示
FSM的核心是从文本数据中提取基本数据,并将其放入表格形式。
鉴于以下原始输入,我们可能对线卡状态和温度感兴趣:
Routing Engine status:
Slot 0:
Current state Master
Election priority Master (default)
Temperature 39 degrees C / 102 degrees F
CPU temperature 55 degrees C / 131 degrees F
DRAM 2048 MB
Memory utilization 76 percent
CPU utilization:
User 95 percent
Background 0 percent
Kernel 4 percent
Interrupt 1 percent
Idle 0 percent
Model RE-4.0
Serial ID xxxxxxxxxxxx
Start time 2008-04-10 20:32:25 PDT
Uptime 180 days, 22 hours, 45 minutes, 20 seconds
Load averages: 1 minute 5 minute 15 minute
0.96 1.03 1.03
Routing Engine status:
Slot 1:
Current state Backup
Election priority Backup
Temperature 30 degrees C / 86 degrees F
CPU temperature 31 degrees C / 87 degrees F
DRAM 2048 MB
Memory utilization 14 percent
CPU utilization:
User 0 percent
Background 0 percent
Kernel 0 percent
Interrupt 1 percent
Idle 99 percent
Model RE-4.0
Serial ID xxxxxxxxxxxx
Start time 2008-01-22 07:32:10 PST
Uptime 260 days, 10 hours, 45 minutes, 39 seconds
通过适当的模板将此文本输入应用于FSM,结果以表格表示形式返回,其中线卡和相关数据作为记录字段关联在一起。
插槽 | 模型 | 德拉姆 | 州 | 温度 | CPU温度 |
---|---|---|---|---|---|
0 | RE-4.0 | 2048 | 主 | 39 | 55 |
1 | RE-4.0 | 2048 | 后备 | 30 | 31 |
模板文件
模板文件描述了FSM应该如何解析数据。不同的文本输入模式需要单独的模板。例如,解析路由器命令的输出通常需要为每个命令使用一个模板。
完整的示例模板如下。在这种情况下,要处理路由器的上述“ show机箱路由引擎”命令输出:
# Chassis value will be null for single chassis routers.
Value Filldown Chassis (.cc.?-re.)
Value Required Slot (\d+)
Value State (\w+)
Value Temp (\d+)
Value CPUTemp (\d+)
Value DRAM (\d+)
Value Model (\S+)
# Allway starts in 'Start' state.
Start
^${Chassis}
# Record current values and change state.
# No record will be output on first pass as 'Slot' is 'Required' but empty.
^Routing Engine status: -> Record RESlot
# A state transition was not strictly necessary but helpful for the example.
RESlot
^\s+Slot\s+${Slot}
^\s+Current state\s+${State}
^\s+Temperature\s+${Temp} degrees
^\s+CPU temperature\s+${CPUTemp} degrees
^\s+DRAM\s+${DRAM} MB
# Transition back to Start state.
^\s+Model\s+${Model} -> Start
# An implicit EOF state outputs the last record.
模板文件由两个顶级部分组成。
- “值”定义,描述要提取的数据列。
- 一个或多个“状态”定义,描述了在解析数据时引擎的各种状态。
如果一行以任何可选的空格开头,则该哈希即为正则表达式:匹
配"^\s*#"。
值定义
一或多个“值”行用于描述结果表中的每一列。这些值行必须全部出现在任何状态定义之前,并且必须是连续的行,仅由注释分隔。
每个“价值”行的格式如下:
值 [option [,option ...]]名称正则表达式
关键词 | 类型 | 描述 |
---|---|---|
值 | 关键词 | 表示这是必填项的值行条目。 |
选项 | 标记,逗号分隔(无空格) | 关于价值的额外选择。可能是 以下一项或多项: 填充先前匹配的值将保留用于后续记录(除非明确清除或再次匹配)。换句话说,除非再次匹配,否则将最近匹配的值复制到较新的行。关键字声明字段内容构成行的唯一标识符。 必需仅当此值匹配时,记录(行)才保存到表中。 列表值是一个列表,附加在每个匹配项上。通常,匹配项将覆盖该 行中的所有先前值。Fillup像Filldown,但向上填充,直到找到一个非空条目。与“必 需”不兼容。 |
名称 | 值名称 | 值的名称,该名称最终将作为列名称。不得为有效选项的名称。 |
正则表达式 | 正则表达式 | 值将与之匹配的正则表达式。此正则表达式必须包含在括号内。 |
状态定义
在值定义之后,将描述状态定义。每个状态定义由空白行分隔。第一行是州名,一个字母数字单词,后接一系列规则。
状态定义具有以下格式:
stateName
^rule
^rule
...
多个状态定义应至少由一个空白行分隔。规则在州名后的连续行中描述,并且必须缩进一两个空格和一个克拉('^')。
最初,FSM将在“ 开始”状态下开始。仅将输入与当前状态进行比较,但是匹配的行可以触发到新状态的转换。评估逐行进行,直到遇到EOF或当前状态转换为End状态为止。
保留状态
FSM以Start状态启动,因此此标签是必需的,没有它,模板将无法解析。
如果EOF被输入达成,则EOF状态时执行。这是一个隐式状态,看起来像:
EOF
^.* -> Record
EOF在返回之前记录当前行。要覆盖此行为-显式定义一个空的EOF状态。像这样的结束状态被保留,并且终止处理的输入线,并且不执行所述EOF状态。
EOF
州规则
每个状态定义都包含一个或多个规则的列表。FSM从输入缓冲区读取一行,并从当前状态的顶部开始依次针对每条规则对其进行测试。如果规则与该行匹配,那么将执行该操作,并且该过程(从状态顶部再次开始)与下一行重复。
规则具有以下格式:
^ 正则表达式 [ -> 操作 ]
regex是与输入行相比的正则表达式。匹配是从输入行的开头执行的,因此,克拉号('^')尽管隐含,但仍是必需的语法,以提醒您此行为。
正则表达式可以包含零个或多个值描述符。值描述符的格式为 {ValueName}(首选后一种格式),并指示值分配。将关联值的正则表达式替换为规则regex,如果该行匹配,则将与此值匹配的文本分配给当前行。为了表示行尾(EOL),请使用双美元符号“ $$”,它将在“值”替换期间替换为单个美元符号。
例如,使用以下模板:
Value Interface (\S+)
Start
^Interface ${Interface} is up
最初分析模板时,FSM会将规则的正则表达式扩展为:
^Interface (\S+) is up
如果通过此规则分析了以下行,那么将为值“接口”赋予值GigabitEthernet1 / 10
Interface GigabitEthernet1/10 is up.
可以将多个值替换放入规则正则表达式中。整个扩展的正则表达式必须匹配,才能分配任何值。
规则动作
在正则表达式之后,可以描述动作,以“->”分隔,其格式为“ AB C”。
动作分为三个可选部分。A)线动作,在输入线上的动作。B)记录操作,对到目前为止收集的值执行操作。C)国家过渡。
如果未描述动作,即没有'->',则默认的隐式动作为Next.NoRecord。
- 线动作
行动 | 描述 |
---|---|
下一个 | 从输入行结束,读下一行,然后从状态开始再次开始匹 配。如果未指定任何行操 作,则这是默认行为。 |
继续 | 从输入行结束,读下一行,然后从状态开始再次开始匹 配。如果未指定任何行操作 , 则这是默认行为。 |
什么是CliTable
见下一章节