我尝试在一个块上执行两次匹配,在expect脚本中返回数据。这是从命令返回的数据显示此系统连接的内容(我更改了描述以保护敏感信息)。我以为我可以使用expect_out(缓冲区),但我无法弄清楚如何解析返回的数据以检测模式的两个唯一实例。如果我检测到一个模式的实例,我可以重新运行该命令,但是这不允许我检测返回数据中有两个模式的唯一实例的情况,因为期望{}将重新找到第一种模式。例如' abcd'和' abcd'。
案例一:我将零实例' abcd'' efgh',' ijkl',' mnop'或者& #39; qurs'在返回的块中 - 在这种情况下,不会将任何内容写入文件,这很好。
案例二:我将只有一次'abcd',' efgh',' ijkl',' mnop',或者' qurs'在文件中,当前代码检测到该情况,然后将一个模式的存在写入文件以供稍后处理。
案例三:我有两个模式实例' abcd' efgh',' ijkl' mnop',或者' qurs',在任何组合中。我可以用abcd',#ab;&#39 ;; ' abcd',' efgh&#39 ;;或者' ijkl',' mnop'。如果发生第3种情况,我需要在文件中写入不同的消息。
有人可以帮忙吗?
我的数据:
A4 | 48 48 changedToProtectPrivacy
A15 | 48 48 changedToProtectPrivacy
A16 | 48 48 changedToProtectPrivacy
A17 | 48 48 changedToProtectPrivacy
A18 | 48 48 changedToProtectPrivacy
A19 | 48 48 changedToProtectPrivacy
A20 | 48 48 changedToProtectPrivacy
A21 | 48 48 changedToProtectPrivacy
A24 | abcd
A24 | abcd
B1 | 48 48 changedToProtectPrivacy
B2 | 48 48 changedToProtectPrivacy
B3 | 48 48 changedToProtectPrivacy
B4 | 48 48 changedToProtectPrivacy
B5 | 48 48 changedToProtectPrivacy
B6 | 48 48 changedToProtectPrivacy
B21 | 48 48 changedToProtectPrivacy
B24 | abcd
B24 | abcd
D2 | 00 ... 1 changedToProtectPrivacy
D10 | 00 ... 1 changedToProtectPrivacy
E6 | 00 ... 1 changedToProtectPrivacy
- = - 当前代码snippit - = -
expect { "prompt" } send { "superSecretCommand" ; sleep 2 }
expect {
"abcd" { set infofile "info.$server" ;
set ::infofile [open $infofile a] ;
puts $::infofile "Connection detected" ;
close $::infofile ;
}
"efgh" { set infofile "info.$server" ;
set ::infofile [open $infofile a] ;
puts $::infofile "Connection detected" ;
close $::infofile ;
}
}
答案 0 :(得分:1)
我想你需要的是这样的:
[STEP 101] $ cat infile
A20 | 48 48 changedToProtectPrivacy
A21 | 48 48 changedToProtectPrivacy
A24 | abcd
A24 | abcd
B1 | 48 48 changedToProtectPrivacy
B6 | 48 48 changedToProtectPrivacy
B7 | ijkl
B21 | 48 48 changedToProtectPrivacy
B24 | efgh
B24 | abcd
D2 | 00 ... 1 changedToProtectPrivacy
D3 | efgh
D3 | abcd
D10 | 00 ... 1 changedToProtectPrivacy
D11 | ijkl
E6 | 00 ... 1 changedToProtectPrivacy
E7 | ijkl
[STEP 102] $ cat foo.exp
#!/usr/bin/expect
log_user 0
spawn -noecho cat infile
set pat1 {[\r\n]+[[:blank:]]*[A-Z][0-9]+[[:blank:]]*\|[[:blank:]]*}
set pat2 {[a-z]{4,4}}
expect {
-re "${pat1}($pat2)${pat1}($pat2)|${pat1}($pat2)" {
if {[info exists expect_out(3,string)]} {
send_user ">>> $expect_out(3,string)\n"
} else {
send_user ">>> $expect_out(1,string) $expect_out(2,string)\n"
}
array unset expect_out
exp_continue
}
}
[STEP 103] $ expect foo.exp
>>> abcd abcd
>>> ijkl
>>> efgh abcd
>>> efgh abcd
>>> ijkl
>>> ijkl
[STEP 104] $