Expect Script - 在一个返回的缓冲区中检测模式的两个唯一实例

时间:2015-01-07 22:46:15

标签: regex expect

我尝试在一个块上执行两次匹配,在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 ;
                                }
}

1 个答案:

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