textfsm初探之使用TextFSM解析CLI输出(Python)

前言: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) )
    
    该库直接可执行,可用于检查模板的语法并将输入与预期输出进
    行比较。
    parser.py [--help] template [input_file [output_file]]
    
    如果作为软件包安装,它将在相关的python版本下。
    /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或 {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


见下一章节

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容