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] $