简介
-
TextFSM是一个Python模块,该模块实现了用于分析半格式文本的基于模板的状态机。最初是为了允许以编程方式访问由CLI驱动的设备(例如网络路由器和交换机)的输出所给出的信息而开发的,但是它可用于任何此类文本输出。
-
引擎接受两个输入-模板文件和文本输入(例如来自设备的CLI的命令响应),并返回包含从文本中解析出的数据的记录列表。
-
每个唯一结构化的文本输入都需要一个模板文件。该代码提供了一些示例,并鼓励用户自己开发。
-
通过开发模板文件池,脚本可以调用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 :必填项
- Required :必填项
-
名称:名称必须是大写字母
-
正则表达式:匹配改名称的正则
# 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']]