如何在Expect中保存和解析命令输出?

时间:2010-01-16 14:58:08

标签: tcl expect

我在Linux服务器上编写Expect脚本的过程中,该服务器应该telnet到路由器以收集一些系统信息。到目前为止,我的脚本可以成功建立连接,运行路由器命令,断开连接并终止。

该命令显示了我需要解析的几行,我不确定在Expect中该怎么做。如何保存输出,grep一行,然后是行中的一列,最后将结果保存到文件中?如果可能的话,我想完全使用Expect而不是解决方法(例如Expect嵌入Bash)。

感谢您的时间。 jk04

3 个答案:

答案 0 :(得分:7)

期望发展的两个提示:

  • autoexpect为您的自动化设置框架
  • exp_internal 1详细说明了内部的期望。当你无法弄清楚为什么你的正则表达式没有捕捉到你期望的东西时,这个是必不可少的。

答案 1 :(得分:6)

基本上,$ expect_out(缓冲区)[1]。保持上次期望匹配的输出到当前的匹配。你可以在那里找到你的命令输出。

对于字符串操作,您可以简单地使用tcl的内置[2] [3]。

  1. “如何在Expect中访问远程命令的结果”http://wiki.tcl.tk/2958
  2. “regexp”http://wiki.tcl.tk/986
  3. “字符串匹配”http://wiki.tcl.tk/4385

答案 2 :(得分:4)

我遇到并解决了与bash交互的类似问题。我相信这种方法可以推广到任何其他提供无操作,固定字符串输出的交互式环境。

基本上,我用两个固定字符串包装命令,然后在开头和结尾搜索包含这些字符串的模式,并将内容保存在它们之间。例如:

set var "";
expect $prompt { send "echo PSTART; $command; echo PEND;\r"; }
expect {
    -re PSTART\r\n(.*)PEND\r\n$prompt { set var [ string trim $expect_out(1,string) ]; send "\r"; }
    -re $prompt { set var "" ; send "\r"; }
    timeout { send_user "TIMEOUT\n"; exit }
}

我怀疑这种方法也适用于shell的注释字符,或者是一个返回已知输出的简单状态命令。

然后你可以用'var'的内容做任何你需要的事。