regex TEXTFSM怪异行为

ymzxtsji  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(146)

我需要解析以下CLI输出:

Status and Counters - General System Information

  System Name        : Switch-Name-2
  System Contact     :
  System Location    :

  MAC Age Time (sec) : 300

  Time Zone          : 0
  Daylight Time Rule : None

  Software revision  : WC.16.10.0009        Base MAC Addr      : ******-******

  ROM Version        : WC.16.01.0008        Serial Number      : **********

  Up Time            : 371 days             Memory   - Total   : 339,329,536
  CPU Util (%)       : 9                               Free    : 217,292,368

  IP Mgmt  - Pkts Rx : 7,218,420            Packet   - Total   : 6600
             Pkts Tx : 6,911,783            Buffers    Free    : 4281
                                                       Lowest  : 4161
                                                       Missed  : 0

字符串
我认为我已经做了一个很好的工作与以下TEXTFSM模板:

Value Uptime (\d+\s\S+)
Value CPU (\d+)
Value MemTotal (\S+)
Value MemFree (\S+)

Start
  ^${Uptime}
  ^\)\s+:\s${CPU}
  ^Memory\s+-\sTotal\s+:\s${MemTotal}
  ^\d+\s+Free\s+:\s+${MemFree} -> Record


但是它总是返回无输出:S
我对TEXTFSM还很陌生,但归根结底,它只是REGEX。
我希望输出是正常运行时间,CPU %,内存总量和内存空闲

snz8szmq

snz8szmq1#

尝试一个 * 捕获模式 *。

(?:Up Time|Memory.+?Total|CPU Util|(?<=\d)\s+?Free).+?:.+?([\d,]+)

个字符

lstz6jyr

lstz6jyr2#

这个对我很有效

Value Uptime (\d+\s\S+)
Value CPU (\d+)
Value MemTotal (\S+)
Value MemFree (\S+)

Start
  ^Up\sTime\s+:\s${Uptime}\s+Memory\s+\-\sTotal\s+:\s+${MemTotal}
  ^CPU\sUtil\s\(\%\)\s+:\s${CPU}\s+Free\s+:\s+${MemFree} -> Record

字符串

  • 首先:* 你忘记了Up Time :作为第一个值。
  • 第二:* 一些值在一行中,因此它们可能必须在模板中的同一行中。

顺便说一句:模板中的^表示行的开头,因此您不能使用^搜索不在行开头的元素。您不能使用^${Uptime}搜索值,因为值之前有文本Up Time :。您不能使用^\),因为)不在行的开头。您必须添加.*才能捕获所有其他值)
而且-在模板中似乎有特殊的含义,所以需要\-
用于测试的代码

import textfsm

template_fh = open('template.txt')     # without `.read()` to get `file handler`
data        = open('data.txt').read()  # with `.read()` to get `text` 

template = textfsm.TextFSM(template_fh)
data     = template.ParseText(data)

print( ' | '.join(template.header) )
# Each row of the table.
for row in data:
  print( ' | '.join(row) )


测试结果:

Uptime | CPU | MemTotal | MemFree
371 days | 9 | 339,329,536 | 217,292,368

编辑:

同样的代码直接在代码中加上数据和模板.
我使用io.StringIO()创建file-like对象。

import textfsm
import io

# use `io.String` to create `file-like` object
template_fh = io.StringIO('''Value Uptime (\d+\s\S+)
Value CPU (\d+)
Value MemTotal (\S+)
Value MemFree (\S+)

Start
  ^Up\sTime\s+:\s${Uptime}\s+Memory\s+\-\sTotal\s+:\s+${MemTotal}
  ^CPU\sUtil\s\(\%\)\s+:\s${CPU}\s+Free\s+:\s+${MemFree} -> Record
''')

data = '''Status and Counters - General System Information

System Name        : Switch-Name-2
System Contact     :
System Location    :

MAC Age Time (sec) : 300

Time Zone          : 0
Daylight Time Rule : None

Software revision  : WC.16.10.0009        Base MAC Addr      : ******-******

ROM Version        : WC.16.01.0008        Serial Number      : **********

Up Time            : 371 days             Memory   - Total   : 339,329,536
CPU Util (%)       : 9                               Free    : 217,292,368

IP Mgmt  - Pkts Rx : 7,218,420            Packet   - Total   : 6600
           Pkts Tx : 6,911,783            Buffers    Free    : 4281
                                                     Lowest  : 4161
                                                     Missed  : 0
'''

template = textfsm.TextFSM(template_fh)
data     = template.ParseText(data)

print( ' | '.join(template.header) )
# Each row of the table.
for row in data:
  print( ' | '.join(row) )

相关问题