0

我需要解析来自telnet/ssh命令的结果数据并对数据采取行动。

例如,我想与生成会话(ssh此处)进行交互,列出当前目录中的文件并仅收集某个扩展名的文件,以便稍后仅对这些文件执行命令。

到目前为止我得到了什么:

#!/usr/bin/expect

set timeout 3
match_max 10000
set prompt {$ }

spawn ssh $user@$host
expect "password: "
send $pw\r
expect $prompt

# here's the command I need to parse resulting data
send "ls -1\r"
expect -re {(.*)\.log} {
    set val $expect_out(1,string)
    puts "LOG file: $val"
    exp_continue
}

该脚本打开一个ssh会话,发送命令并显示当前目录(日志和其他)中的所有文件,但我需要处理与给定模式匹配的每个文件,我该怎么做?

脚本输出:

$  DATA: 
0_system.log
1_system.log
2_system.log
3_system.log
a.log
a.sh
blah
b.sh
data.csv
4

2 回答 2

1

首先......不会ls -1 *.log更容易,做的伎俩?

也就是说,我发现通常你在使用时必须非常小心(.*),它有时会产生意想不到的结果。

我会使用“任何字母数字字符加下划线”(如果这适用于您的文件名) - 请参阅下面我建议的期望块。另外,请记住,通过使用$expect_out(1,string)您只保存文件名,没有扩展名- 不确定这是否是您想要的。如果你想要整个事情,$expect_out(0,string)在这种情况下是要走的路。

这将做到:

expect -re "(\[a-zA-Z0-9_\]*)\.log" {
    set val $expect_out(1,string)
    puts "LOG file: $val"
    exp_continue
}

希望有帮助!詹姆士

于 2013-11-10T00:33:33.390 回答
0

更正的预期可能应该是:

expect {
    -re {(.*)\.log} {
        set val $expect_out(1,string)
        puts "LOG file: $val"
        exp_continue;
    }
}
于 2013-11-07T16:58:27.567 回答