textFSM 模板中的可选字符串

问题描述

我有一个 moxa 开关 show running-config 的 cli 输出。接口部分可能有也可能没有名称字符串。

interface ethernet 1/3
 shutdown
 name Unused
 speed-duplex Auto
 no flowcontrol
 media cable-mode auto
 no gmrp
 switchport access vlan  1
 rate-limit port-disable ingress rate none
 no ptp
!

interface ethernet 1/8
 shutdown
 speed-duplex Auto
 no flowcontrol
 media cable-mode auto
 no gmrp
 switchport access vlan  1
 rate-limit port-disable ingress rate none
 no ptp

这是我的 FSM 解析模板

Value port (\d\/\d)
Value state (shutdown|no shutdown)
Value desc (\S+)

Start
  ^interface ethernet ${port} -> Continue.Record
  ^.${state}
  ^.name.${desc}

但是这样接口名称输出向下移动了一行。如何修复此模板?

输出示例

port    state        desc
------  -----------  ----------------
1/1
1/2     no shutdown  Cisco_2960_OTPSS
1/3     no shutdown  Mirror
1/8     shutdown     Unused
1/9     shutdown
        no shutdown  Proverka

解决方法

链接 TextFSM usage 在描述不完整的路由条目时显示了一个与您的问题非常相似的示例:

...不完整的路由条目应该在下一个完整的路由条目出现时写入,但同时它们应该写入适当的路由。应该做到以下几点:一旦满足完整路由条目,就应该记下之前的值,然后继续处理相同的完整路由条目以获取其信息。

在您的上下文中:

^interface ethernet -> Continue.Record

这里,Record 动作告诉您写下变量的当前值。由于此规则中没有变量,因此会写入先前值中的内容。 Continue 操作表示继续处理当前行,就好像没有匹配一样。

Start
  ^interface ethernet -> Continue.Record
  ^interface ethernet ${port}
  ^.${state}
  ^.name.${desc}
port    state     desc
------  --------  ------
1/3     shutdown  Unused
1/8     shutdown

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...