2010-09-21 5 views
0

Je suis un total attendez noob.Faire une action pour chaque match dans l'attente

Je vous écris un attendre script pour un test où je veux compter le nombre d'occurrences de la chaîne « Ok » et faire une action pour chaque occurrence de la sortie suivante:

Reloading configuration on all nodes 
Reloading configuration on node 1 (node1-c5) 
OK 
Reloading configuration on node 2 (node2-c5) 
OK 
Reloading configuration on node 3 (node3-c5) 
OK 
Reloading configuration on node 4 (node4-c5) 
OK 

Comment se mon bloc s'attendre à ressembler?

Répondre

3

Je réécris votre code pour supprimer la boucle while:

set number_ok 0 
set node_patt "(Reloading configuration on node (\\d+?) \\((\[^)]+?)\\))\r\n(.+?)\r\n" 

send "cluster config -r -a\r" 
expect { 
    ERROR {cluster_exit 1} 
    -re $node_patt { 
     set line "<$cmdline> $expect_out(1,string)" 
     set node_num $expect_out(2,string) 
     set node_name $expect_out(3,string) 
     set result $expect_out(4,string) 

     switch -regexp $result { 
      "Node .+ not found" { 
       ok 0 "$line (not found)" 
      } 
      "Node .+ not responding, skipped" { 
       ok 0 "$line (not responding)" 
      } 
      OK { 
       ok 1 $line 
       incr number_ok 
      } 
     } 
     exp_continue ;# loop back to top of expect block 
    } 
    $ROOT_PROMPT ;# no action, so fall out of the expect block 
} 

Notez que les expressions régulières Tcl sont soit entièrement gourmand ou entièrement non-gourmand. J'utilise \r\n(.+)\r\n pour capturer la ligne suivant "Rechargement de la configuration sur le noeud ...". Cependant, la partie .+ ne doit pas contenir de retour à la ligne, elle doit donc être non gourmande. Ainsi, chaque quantificateur dans node_patt doit être non gourmand.

+0

A travaillé comme une horloge! Thnx! – Codeape

+2

Notez que les RE de Tcl ne sont * pas * entièrement gourmands ou non gourmands, mais les règles de ce qui se passe quand sont automates-théoriques et donc très difficiles à comprendre sauf dans quelques cas (par exemple, les contraintes de lookahead, qui sont toujours non glouton). Il est toujours plus facile d'écrire en utilisant un seul type d'ER si vous le pouvez. –

1

Le code a fini par ressembler à ceci (une simple boucle):

send "cluster config -r -a \r" 
set done 0 
set number_ok 0 
while {$done == 0} { 
    set done 1 
    expect { 
     $ROOT_PROMPT { set done 1 } 
     "ERROR" { cluster_exit 1 } 
     -re "Reloading configuration on node.*\r" { 
     set line "<$cmdline> $expect_out(0,string)" 
     expect { 
      $ROOT_PROMPT { set done 1 } 
      "ERROR" { cluster_exit 1 } 
      -re "Node * not found" { ok 0 "$line (not found)" } 
      -re "Node * not responding, skipped" { ok 0 "$line (not responding)" } 
      "OK" { 
       ok 1 "$line" 
       set number_ok [expr $number_ok + 1] 
       set done 0 
      } 
     } 
     } 
    } 
} 
diag "Done $done" 
diag "Count $number_ok" 
Questions connexes