分割命令的输出并在expect中搜索单词

分割命令的输出并在expect中搜索单词

我有这段代码,我希望它读取命令的输出,将其从开头子串到特殊字符,然后如果该部分不为空则发送它传递的日志。但我不知道该怎么做。这是我到目前为止所得到的。

#!/opt/tools/unsupported/expect-5.39/bin/expect

spawn ssh -l $USER $VMIP_1
expect_after eof {exit 0}
set timeout 10
match_max 256

expect "(yes/no)?" { send "yes\r" }
expect "password:" { send "$PASSWORD\r" }

expect "~]#" { send "date\r" }

expect "~]#" { send "pidof snmpd\r" }
sleep 5
expect "~]#" {
set buf [split $expect_out(buffer) "[root@"]
if {[lindex $buf 0] !=="" }
{
        log_file /home/bebehman/vnf/trunk/report.txt
                 send_log "Verify net-snmp installation and functionality on $VMIP_1--------------------- Passed\n"
    } else { send_log "Verify net-snmp installation and functionality on $VMIP_1--------------------- Failed\n"
    }
 }

答案1

请注意,这split并不像您想象的那样工作。它不会根据单词进行拆分,而是根据第二个字符串中给出的任何字符进行拆分。例如,split "xax" "abc"确实会分为xax两部分,尽管它不包含序列abc

例如,在给定子字符串处分割字符串的一种简单方法是使用命令string first查找子字符串的开头,然后string range复制到该点:

set str $expect_out(buffer)
set v [string range $str 0 [string first "\[root@" $str]-1]

然后您可以测试v是否为空。

或者,不是执行expect "~]#",为什么不执行expect "\[root@",然后$expect_out(buffer)将已经包含您想要提取的内容。


对于早期版本的 tcl/expect,您可能需要使用expr从索引中减去 1,而不是让string range接受数字-数字的形式。因此,例如使用:

set v [string range $str 0 [expr [string first "\[root@" $str] - 1]]

答案2

if {[lindex $buf 0] !=="" }
{

不会编译;相反你需要这个

if { [lindex $buf 0] != "" } {

相关内容