【问题标题】:Regex to retrieve firmware version number from Cisco IOS `show version`正则表达式从 Cisco IOS `show version` 检索固件版本号
【发布时间】:2012-07-29 22:02:54
【问题描述】:

我需要帮助从 Cisco“show version”命令的输出中获取固件版本

以下是显示版本输出的第一行(其中“12.4(21a)JA1”是固件版本):

Cisco IOS Software, C1240 Software (C1240-K9W7-M), Version 12.4(21a)JA1, RELEASE
SOFTWARE (fc1)

下面的代码给了我错误:无法编译正则表达式模式:量词操作数无效

expect "*#" {send "show version\n"}
expect -re "(?<=Version/s)(.*)(?=/sRELEASE)" {set var1 $expect_out(1,string)}
puts "Firmware Version: $var1"

感谢您的帮助

【问题讨论】:

    标签: regex tcl expect cisco cisco-ios


    【解决方案1】:

    您的问题有两个方面。首先,Expect 不支持后视约束(嗯,不支持正常构建)。其次,您的正则表达式混淆了它使用的斜杠类型。在 Tcl 和(通过扩展)Expect 中将正则表达式放在大括号中总是一个好主意。我还建议在事情变得更长时使用expect 的多行版本(如下所示),因为这样看起来更容易。

    expect "*#" {send "show version\n"}
    expect {
        -re {Version\s+(.*),\s+RELEASE} {
            set firmwareVersion $expect_out(1,string)
        }
    }
    puts "Firmware Version: $firmwareVersion"
    

    将东西放在大括号中的唯一缺点是 SO 格式错误。我认为我们可以度过这样的困难……

    【讨论】:

    • 重建 Tcl 以使用 PCRE 作为其 RE 引擎是可能 - 尽管目前这不是受支持的配置,甚至任何实际在 Tcl 主源中的配置树(我知道一个商业实验)——如果这样做了,那么 Expect 可能仍然可以正常工作。或者它可能不会; Expect 使用了很多比较晦涩的功能,非常努力地驱动 RE 引擎。
    • +1 我要提一下,由于他正在与思科进行交互,因此他还需要在期望中寻找提示......因此我的建议
    • 顺便说一句,您的正则表达式需要使用? 进行限制,因为.* 太贪婪并且超出了必要的范围......我会使用(\d.+?),
    • @Mike 不贪婪并没有你想象的那么好。 Expect 会在数据进入时应用该模式,因此保持匹配空间较小并没有真正的好处。 (如果在数据流中有很多“Version”的用法,或者如果有两个“RELEASE”字,这会有所帮助,但这不太可能。)最好使用(\S*),因为这太多了不太可能匹配一段长文本,但这并不重要,因为匹配空间也受先前匹配的提示的约束。
    • 我认为他可以找到提示;我根本不了解思科设备(除了声誉)。
    【解决方案2】:

    原创

    expect "*#" {send "show version\n"}
    expect -re "(?<=Version/s)(.*)(?=/sRELEASE)" {set var1 $expect_out(1,string)}
    puts "Firmware Version: $var1"
    

    首先,正如 Donal 提到的,expect 不支持后视正则表达式...

    另外,我认为您会发现在交互时匹配字符串并执行变量替换有点挑战。这很有可能,但这样做更容易......

    建议

    expect "*#" {send "show version\n"}
    expect "*#" {send "# something else here"}
    regexp {Version\s(\d.+?),\sRELEASE\sSOFTWARE} $expect_out(buffer) matched var1
    puts "Firmware Version: $var1"
    

    【讨论】:

    • 匹配一个在一行上的字符串并不难。这是多线匹配,可以得到......令人兴奋......
    • 但 Cisco show version 输出需要多行匹配才能同时获得版本号提示
    猜你喜欢
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多