我目前正在优化一个期望脚本,可以从不同类型的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
数组也包含其他内容。阅读所有详细信息的期望人页面。