期望: ^在描述不同Cisco设备的命令提示的正则表达式中不起作用



我目前正在优化一个期望脚本,可以从不同类型的Cisco设备收集信息,并在正则表达式区域中存在休息问题。非常感谢您的友好帮助。

背景/问题:Cisco Nexus设备在命令输出中使用"#"one_answers"#",它会影响脚本逻辑,该脚本逻辑使用相同的字符在发送下一个命令之前识别命令提示符。

我可以使用命令提示的更具体的定义来解决大多数问题:

set prompt {([A-Z,a-z,0-9]+)(%|#|>|\$)[\ ]?$}

,然后在脚本中:

expect -re $prompt
send "$cmdr"

现在我想让这个正则表达更具体,"线开始,然后提示"通过在正则表达式的开头添加载体"^",但这会失败,脚本在发送下一个CMD之前始终进入超时。

set prompt {(^[A-Z,a-z,0-9]+)(%|#|>|\$)[\ ]?$}

这也失败

set prompt {^([A-Z,a-z,0-9]+)(%|#|>|\$)[\ ]?$}

在日志文件中,我看到命令提示符由Cr(^M,0x0d)启动。

更加好奇,这仍然没有暂停,所以是的,是的,CISCO CLI提示的CR:

set prompt {[x0d]([A-Z,a-z,0-9]+)(%|#|>|\$)[\ ]?$}

,但不是在使用"^"

set prompt {^[x0d]([A-Z,a-z,0-9]+)(%|#|>|\$)[\ ]?$}

使用少浏览日志文件时,我会看到:

^MDevice123# term len 0^M
^MDevice123# show inventory^M

hexdump在线的末端和新线之间显示:

0d 0d 0a 0d (CR CR LF CR)

我的目标有什么问题,以从一开始到线结束时提示提示,以使命令提示的正则表达式更具体?

^将与 buffer 的开头匹配,而不仅仅是行的开头。

由于预期是在TCL上构建的,因此您可以使用TCL REGEX语法表明您希望^在任何newline之后与空字符串匹配:

set prompt {(?n)^[[:alnum:]]+[%#>$]s?$}
# ..........^^^^

注意:

  • 在括号表达式中,使用逗号表示您也想匹配逗号。而不是[A-Z,a-z,0-9],您希望[A-Za-z0-9]匹配字母或号码,或使用上面显示的字符类。
  • 我怀疑您不需要捕获括号的位。

在最后一点上扩展,当您这样做时:

set prompt {([A-Za-z0-9]+)(%|#|>|\$)[\ ]?$}
expect -re $prompt

现在假设它按预期工作。还假设您的提示看起来像:

myHostname1234>

expect之后,期望将 expect_out数组中的正则捕获部分保存:

  • $expect_out(0,string)将包含符合正则匹配的文本
  • $expect_out(1,string)将包含"([A-ZA-Z0-9] )捕获的字母和数字,在这种情况下," myhostname1234"
  • $expect_out(2,string)将包含由"(%|#|> | $)捕获的提示符号",在这种情况下,">">"

我怀疑您不使用代码中的expect_out变量,因此无需期望会遇到存储匹配的文本的麻烦。我怀疑您真的不在乎什么是及时的符号。

我知道将括号分组需要括号。但是,如果您不需要记住匹配的文本,则可以使用(?:subpattern)获取分组行为而无需记住行为。

expect_out数组也包含其他内容。阅读所有详细信息的期望人页面。

最新更新