Expect Script - 在一个返回的缓冲区中检测一个模式的两个唯一实例
Expect Script - detecting two unique instances of a pattern in one returned buffer
我正在尝试在 expect 脚本中对一个块返回的数据进行两次匹配。这是一个命令返回的数据,显示了这个系统连接到什么(我更改了描述以保护敏感信息)。我以为我可以使用 expect_out(buffer),但我不知道如何解析返回的数据以检测模式的两个独特实例。如果我检测到一个模式实例,我可以重新运行该命令,但这将不允许我检测到我在返回的数据中有两个独特的模式实例的情况,因为 expect{} 会重新找到第一个模式.例如 'abcd' 和 'abcd'.
情况一:我将在返回的块中有零个 'abcd'、'efgh'、'ijkl'、'mnop' 或 'qurs' 的实例 - 在在这种情况下,不会将任何内容写入文件,这很好。
情况二:我将在文件中只有一次 'abcd'、'efgh'、'ijkl'、'mnop' 或 'qurs' 的实例,当前代码检测到这种情况,然后将一种模式的存在写入文件以供以后处理。
情况三:我有两个模式 'abcd'、'efgh'、'ijkl'、'mnop' 或 'qurs' 的任意组合实例对。我可以 'abcd', 'abcd'; 'abcd', 'efgh';或 '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
-=- 当前代码片段 -=-
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 ;
}
}
我猜你需要的是这样的:
[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] $
我正在尝试在 expect 脚本中对一个块返回的数据进行两次匹配。这是一个命令返回的数据,显示了这个系统连接到什么(我更改了描述以保护敏感信息)。我以为我可以使用 expect_out(buffer),但我不知道如何解析返回的数据以检测模式的两个独特实例。如果我检测到一个模式实例,我可以重新运行该命令,但这将不允许我检测到我在返回的数据中有两个独特的模式实例的情况,因为 expect{} 会重新找到第一个模式.例如 'abcd' 和 'abcd'.
情况一:我将在返回的块中有零个 'abcd'、'efgh'、'ijkl'、'mnop' 或 'qurs' 的实例 - 在在这种情况下,不会将任何内容写入文件,这很好。
情况二:我将在文件中只有一次 'abcd'、'efgh'、'ijkl'、'mnop' 或 'qurs' 的实例,当前代码检测到这种情况,然后将一种模式的存在写入文件以供以后处理。
情况三:我有两个模式 'abcd'、'efgh'、'ijkl'、'mnop' 或 'qurs' 的任意组合实例对。我可以 'abcd', 'abcd'; 'abcd', 'efgh';或 '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
-=- 当前代码片段 -=-
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 ;
}
}
我猜你需要的是这样的:
[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] $