0

我正在寻找一个匹配这两条线中的任何一条的正则表达式,并捕获/分组速度和双工的值。

speed: 1000Mbps (Duplex: full)
speed: n/a

第 1 行应具有值为“1000Mbps”的第 1 组和值为“满”的第 2 组。第 2 行只有第 1 组,值为“n/a”

这是我能得到的最接近的,试图在嵌套组中使用备用。它让我得到速度值,而不是双工值。

^\s+speed:\s+(\S+)\s*(|\(Duplex:\s+(\S+)\))

更长的版本

这是一个 TextFSM 模板。我将在此处包含这些详细信息,以防使用 FSM 有一种简单的方法可以完成上述操作。

样本数据:

== [onboard]
        ==[mgmt]
                mode: static
                ip: 1.2.3.4 255.255.255.248
                ipv6: ::/0
                status: up
                speed: 1000Mbps (Duplex: full)
        ==[port1]
                mode: static
                ip: 0.0.0.0 0.0.0.0
                ipv6: ::/0
                status: down
                speed: n/a

这是我正在使用的模板文件:

Value Required NAME (\S+)
Value MODE (\S+)
Value IP (\d+?\.\d+?\.\d+?\.\d+?)
Value NETMASK (\S+)
Value STATUS (\S+)
Value SPEED (\S+)
Value DUPLEX (\S+)

Start
  ^==\s+\[onboard\]
  ^\s+==\[${NAME}\]
  ^\s+mode:\s+${MODE}
  ^\s+ip:\s+${IP}\s+${NETMASK}
  ^\s+ipv6:\s+.*
  ^\s+status:\s+${STATUS}
  ^\s+speed:\s+${SPEED}\s+\(Duplex:\s+${DUPLEX}\) -> Record
  ^\s*$$
  ^. -> Error

我已经对上述内容进行了多次尝试,包括第二行以匹配没有“双工”的“速度”。尝试让两行都记录动作,或者只有一个,或者最后一个包罗万象。有没有办法在 FSM 中指定 OR 类型的语句?尝试匹配输入行,如果不匹配,试试那个?

编辑:感谢您的回复。但是,我无法获得在 TextFSM 中工作的任何示例。

4

2 回答 2

1

有几件事:

  1. TextFSM 的重点是通过尝试使用多个正则表达式语句查找匹配项来简化正则表达式的使用,直到找到匹配项。因此,不需要每 1 个所需的捕获有 1 个正则表达式行。你可以简单地这样做:
  ^\s+speed:\s+${SPEED}\s+\(Duplex:\s+${DUPLEX}\) -> Record
  ^\s+speed:\s+${SPEED} -> Record

如果您只是想知道如何将正则表达式用于 单个正则表达式语句,那么其他人所说的将适用,尽管可能不太清楚,因为它是严格按照正则表达式而不是与 TextFSM 相关的。 ^\s+speed:\s+${SPEED}\s+\(Duplex:\s+${DUPLEX}\)需要允许,但不要求之后的一切${SPEED}。在正则表达式中,您可以通过将此部分包装在一个组中来做到这一点,并?在该组之后添加一个 @LiamFiddler 提到的。那只会添加(...)?,看起来像 ^\s+speed:\s+${SPEED}(\s+\(Duplex:\s+${DUPLEX}\))?

  1. 您将记录放在非表格文本的末尾。这是不可靠的,因为输出在硬件和软件之间可能会有所不同(即使所有当前组合都有效,也不能保证在下一个版本中会如此)。如果速度突然移动到第一个字段,那么您将在所有其他字段上落后一个。最好在第一行匹配并使用Continue.Record
Start
  ^==\s+\[onboard\]
  ^\s+==\[\S+\] -> Continue.Record
  ^\s+==\[${NAME}\]

这将在找到新接口时记录条目,但在它捕获${NAME}以下条目的字段之前。自提供以来,带有接口名称的行将继续用于其他匹配项Continue,并且它将在当前正则表达式语句 ( ^\s+==\[${NAME}\]) 之后开始查找匹配项。FirstRecord将没有记录,因为它是空的,并且最后一个条目将被记录,因为 TextFSM 默认具有隐式 final Record

于 2021-01-08T16:38:02.223 回答
1

可以捕获这些值的正则表达式是:

(?:speed:\s)(\d+Mbps|n\/a)(?:(?:\s\(Duplex:\ (\w+)\))|$)

演示:https ://regex101.com/r/DYhDXc/1/

于 2021-01-07T21:01:03.127 回答