正则表达式从Cisco IOS`show version`检索固件版本号

时间:2012-07-29 22:02:55

标签: regex tcl expect cisco cisco-ios

我需要帮助从Cisco“show version”命令

的输出中获取固件版本

以下是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"

感谢您的帮助

2 个答案:

答案 0 :(得分:4)

你的问题是双重的。首先,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错误地格式化它们。我认为,我们可以度过这样的困难......

答案 1 :(得分:3)

<强>原始

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

首先,正如Donal所说,期望不支持后视regexps ......

另外,我认为在相互作用时匹配字符串并执行变量替换会让您觉得有点挑战性。这很可能,但这样做更容易......

<强>建议

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"