ожидаем - ожидаем сравнение - PullRequest
0 голосов
/ 02 марта 2019

У меня есть ввод с удаленного устройства, которое я хочу поймать, и на его основе выполняется несколько команд - скрипт работает нормально!но есть одна проблема - ожидаем, что циклично проходит по каждой строке (с exp_continue), и когда найти совпадение REGEX, выполняется несколько команд, основанных на совпадении ($ hope_out) .. работает нормально .., но буквально основано на каждой строке!:( и я хочу как-то сравнить $pect_out (n, string) с другими предыдущими и фьючерсными совпадениями и выполнить ТОЛЬКО одну команду на основе уникального совпадения.

Может быть, проще привести пример:

Вход содержит: дублированные строки «1/1/1» и «1/1/2», но в разных строках, и я их ловлю и выполняю дублированные команды на их основе: (

Ввод:

VL.  Interface
-----------------------
10   vlanIf:1/1/1:10
20   vlanIf:1/1/3:20
30   vlanIf:1/1/2:30
40   vlanIf:1/1/4:40
50   vlanIf:1/1/2:50
60   vlanIf:1/1/1:60
70   vlanIf:1/1/1:70

Скрипт:

  #!/usr/bin/expect -f
  telnet ...
  ---snipped--
  set prompt "#"

# cmd1
  expect "$prompt" { send "show interface vlan\r" ; set is_ok "cmd1" }
    if { $is_ok != "cmd1" } { send_user "\n## #----- 9 Exit on executing command3\n" ; exit }

# cmd2 ... n
  expect -re "(vlanIf:)(\\d+/\\d+/\\d+):(\\d\{1,4\})" {
    set secondMatch "$expect_out(2,string)" 
    send "show test1 $secondMatch\r"
    send "show test2 $secondMatch\r"
    send "show test3 $secondMatch\r"
    exp_continue
  }

В результате моей попытки получается:

  send "show test1 1/1/1\r"
  send "show test2 1/1/1\r"
  send "show test3 1/1/1\r"

  send "show test1 1/1/3\r"
  send "show test2 1/1/3\r"
  send "show test3 1/1/3\r"

  send "show test1 1/1/2\r"
  send "show test2 1/1/2\r"
  send "show test3 1/1/2\r"

  send "show test1 1/1/4\r"
  send "show test2 1/1/4\r"
  send "show test3 1/1/4\r"

  send "show test1 1/1/2\r"
  send "show test2 1/1/2\r"
  send "show test3 1/1/2\r"

  send "show test1 1/1/1\r"
  send "show test2 1/1/1\r"
  send "show test3 1/1/1\r"

  send "show test1 1/1/1\r"
  send "show test2 1/1/1\r"
  send "show test3 1/1/1\r"

Результаты должны быть такими:

  send "show test1 1/1/1\r"
  send "show test2 1/1/1\r"
  send "show test3 1/1/1\r"

  send "show test1 1/1/3\r"
  send "show test2 1/1/3\r"
  send "show test3 1/1/3\r"

  send "show test1 1/1/2\r"
  send "show test2 1/1/2\r"
  send "show test3 1/1/2\r"

  send "show test1 1/1/4\r"
  send "show test2 1/1/4\r"
  send "show test3 1/1/4\r"

* 1 /1/1, 1/1/3, 1/1/2, 1/1/4 являются переменными, но для примера я поместил содержимое:

1 Ответ

0 голосов
/ 09 марта 2019

Я нашел один ответ, который мне подходит:)

На самом деле это довольно просто.

...
if [regexp $secondMatch $secondMatchSTACKED] {
  exp_continue
} else {
...
send "show test1 $secondMatch\r"
send "show test2 $secondMatch\r"
send "show test3 $secondMatch\r"
set secondMatchSTACKED "$secondMatchSTACKED$secondMatch "
exp_continue
...