textfsm模块介绍

简介

  • TextFSM是一个Python模块,该模块实现了用于分析半格式文本的基于模板的状态机。最初是为了允许以编程方式访问由CLI驱动的设备(例如网络路由器和交换机)的输出所给出的信息而开发的,但是它可用于任何此类文本输出。

  • 引擎接受两个输入-模板文件和文本输入(例如来自设备的CLI的命令响应),并返回包含从文本中解析出的数据的记录列表。

  • 每个唯一结构化的文本输入都需要一个模板文件。该代码提供了一些示例,并鼓励用户自己开发。

  • 通过开发模板文件池,脚本可以调用textFSM来解析来自各种来源的有用信息。也可以在同一数据上使用不同的模板,以创建不同的表(或视图)

    参考文档:https://github.com/google/textfsm/wiki/TextFSM

使用方法

import textfsm

# The argument 'template' is a file handle and 'raw_text_data' is a string
# 加载模板文件
with open('模板文件', 'r') as f:
    template = textfsm.TextFSM(f)

# 通过模板获取配置信息
data = template.ParseText(raw_text_data)

模板文件组成部分解析

部分一:Value定义

格式: Value 选项 名称 字段匹配的正则表达式

在模板文件的最上方,有多个,每一个变量对应一个你要获取的值。

  • Value:关键字

  • 选项:

    • Required :必填项
      img
  • 名称:名称必须是大写字母

  • 正则表达式:匹配改名称的正则

# define values
Value Filldown ProcessName (.+)
Value Begin ([0-9a-fA-F]+)
Value End ([0-9a-fA-F]+)
Value Size (\d+)
Value KernelPageSize (\d+)
Value MMUPageSize (\d+)
Value Rss (\d+)
Value Pss (\d+)
Value Shared_Clean (\d+)
Value Shared_Dirty (\d+)
Value Private_Clean (\d+)
Value Private_Dirty (\d+)
Value Referenced (\d+)
Value Anonymous (\d+)
Value LazyFree (\d+)
Value AnonHugePages (\d+)
Value ShmemPmdMapped (\d+)
Value Shared_Hugetlb (\d+)
Value Private_Hugetlb (\d+)
Value Swap (\d+)
Value SwapPss (\d+)
Value Locked (\d+)
Value VmFlags ((\w|\s)+)

组成部分二:FSM (有限自动状态机)

模板第二部分是一个FSM(有限自动状态机)
① 状态名称
② 每一个状态下有若干条状态规则,状态规则有一个表达式组成,
③ 每一条规则可以填充一个或多个Value字段。填充采用${字段名称}方式
④ 规则后面可以跟一个->,完成状态跳转和记录操作

# Allway starts in 'Start' state.
Start
  ^@@@@@${ProcessName}@@@@@ -> Record Item

# A state transition was not strictly necessary but helpful for the example.
Item
  ^${Begin}\-${End}
  ^MMUPageSize:\s+${MMUPageSize} kB
  ^Rss:\s+${Rss} kB
  ^Pss:\s+${Pss} kB
  ^Shared_Clean:\s+${Shared_Clean} kB
  ^Shared_Dirty:\s+${Shared_Dirty} kB
  ^Private_Clean:\s+${Private_Clean} kB
  ^Private_Dirty:\s+${Private_Dirty} kB
  ^Referenced:\s+${Referenced} kB
  ^Anonymous:\s+${Anonymous} kB
  ^LazyFree:\s+${LazyFree} kB
  ^AnonHugePages:\s+${AnonHugePages} kB
  ^ShmemPmdMapped:\s+${ShmemPmdMapped} kB
  ^Shared_Hugetlb:\s+${Shared_Hugetlb} kB
  ^Private_Hugetlb:\s+${Private_Hugetlb} kB
  ^Swap:\s+${Swap} kB
  ^SwapPss:\s+${SwapPss} kB
  ^Locked:\s+${Locked} kB
  ^VmFlags:\s*${VmFlags} -> Record Item
  

# An implicit EOF state outputs the last record.

示例

模板文件内容如下:
# cisco_asa_show_interface.template
Value Required INTERFACE (\S+)
Value INTERFACE_ZONE (.+?)
Value LINK_STATUS (\w+)
Value PROTOCOL_STATUS (.*)
Value HARDWARE_TYPE ([\w ]+)
Value BANDWIDTH (\d+\s+\w+)
Value DELAY (\d+\s+\w+)
Value DUPLEX (\w+\-\w+)
Value SPEED (\d+\w+\s\w+)
Value DESCRIPTION (.*)
Value ADDRESS ([a-zA-Z0-9]+.[a-zA-Z0-9]+.[a-zA-Z0-9]+)
Value MTU (\d+)
Value IP_ADDRESS (\d+\.\d+\.\d+\.\d+)
Value NET_MASK (\d+\.\d+\.\d+\.\d+)
Value ONEMIN_IN_PPS (\d+)
Value ONEMIN_IN_RATE (\d+)
Value ONEMIN_OUT_PPS (\d+)
Value ONEMIN_OUT_RATE (\d+)
Value ONEMIN_DROP_RATE (\d+)
Value FIVEMIN_IN_PPS (\d+)
Value FIVEMIN_IN_RATE (\d+)
Value FIVEMIN_OUT_PPS (\d+)
Value FIVEMIN_OUT_RATE (\d+)
Value FIVEMIN_DROP_RATE (\d+)

Start
  ^.*Interface ${INTERFACE} "${INTERFACE_ZONE}", is ${LINK_STATUS}.*protocol is ${PROTOCOL_STATUS}
  ^\s+Hardware is ${HARDWARE_TYPE} -> Continue
  ^.*BW ${BANDWIDTH}.*DLY ${DELAY}
  ^.*\(${DUPLEX}.*Auto-Speed\(${SPEED}\)
  ^.*Description: ${DESCRIPTION}
  ^.*MAC address ${ADDRESS}.*MTU ${MTU}
  ^.*IP address ${IP_ADDRESS}, .*subnet mask ${NET_MASK}
  ^.*1 minute input rate ${ONEMIN_IN_PPS} pkts/sec,\s+${ONEMIN_IN_RATE} bytes/sec
  ^.*1 minute output rate ${ONEMIN_OUT_PPS} pkts/sec,\s+${ONEMIN_OUT_RATE} bytes/sec
  ^.*1 minute drop rate, ${ONEMIN_DROP_RATE}
  ^.*5 minute input rate ${FIVEMIN_IN_PPS} pkts/sec,\s+${FIVEMIN_IN_RATE} bytes/sec
  ^.*5 minute output rate ${FIVEMIN_OUT_PPS} pkts/sec,\s+${FIVEMIN_OUT_RATE} bytes/sec
  ^.*5 minute drop rate, ${FIVEMIN_DROP_RATE} -> Record
配置文件内容如下:
# output of show interface
interfaces = '''
Interface GigabitEthernet0/0 "inside", is up, line protocol is up
  Hardware is i82540EM rev02, BW 1000 Mbps, DLY 10 usec
    Auto-Duplex(Full-duplex), Auto-Speed(1000 Mbps)
    Input flow control is unsupported, output flow control is off
    MAC address 0800.2735.03c6, MTU 1500
    IP address 169.254.1.11, subnet mask 255.255.255.0
    0 packets input, 0 bytes, 0 no buffer
    Received 0 broadcasts, 0 runts, 0 giants
    0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored, 0 abort
    0 pause input, 0 resume input
    0 L2 decode drops
    1 packets output, 60 bytes, 0 underruns
    0 pause output, 0 resume output
    0 output errors, 0 collisions, 1 interface resets
    0 late collisions, 0 deferred
    0 input reset drops, 0 output reset drops
    input queue (blocks free curr/low): hardware (511/511)
    output queue (blocks free curr/low): hardware (511/510)
  Traffic Statistics for "inside":
    0 packets input, 0 bytes
    1 packets output, 28 bytes
    0 packets dropped
      1 minute input rate 0 pkts/sec,  0 bytes/sec
      1 minute output rate 0 pkts/sec,  0 bytes/sec
      1 minute drop rate, 0 pkts/sec
      5 minute input rate 0 pkts/sec,  0 bytes/sec
      5 minute output rate 0 pkts/sec,  0 bytes/sec
      5 minute drop rate, 0 pkts/sec
代码:
import textfsm

with open('cisco_asa_show_interface.template', 'r') as f:
    template = textfsm.TextFSM(f)

template.ParseText(interfaces)
输出结果
[['GigabitEthernet0/0',
  'inside',
  'up',
  'up',
  'i82540EM rev02',
  '1000 Mbps',
  '10 usec',
  'Full-duplex',
  '1000 Mbps',
  '',
  '0800.2735.03c6',
  '1500',
  '169.254.1.11',
  '255.255.255.0',
  '0',
  '0',
  '0',
  '0',
  '0',
  '0',
  '0',
  '0',
  '0',
  '0']]

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值