2016-04-25 8 views
1

Ich versuche, etwas Ausgabe von einer CLI zu parsen und iterieren darüber. Die Ausgabe ist ungefähr wie folgt, und ich möchte über jede ID iterieren, um mehr mit diesen Objekten zu tun.Wie man über mehrere erwartete Zeilen iteriert

OVM> Liste ServerPool
Befehl: Liste ServerPool
Status: Erfolg
Daten:
id: 123456789 Name: pool1
ID: 987654321 Name: pool2

Ich habe versucht, der folgende Code, aber aus irgendeinem Grund hängt es nach dem Drucken der zweiten ID. Ich denke, es hat etwas mit exp_continue zu tun, aber ich verstehe nicht, zu gut zu erwarten. Außerdem mache ich diese einfache Lösung für den Fall, dass ich nur 2 IDs habe, weil ich nicht weiß, wie man sie verallgemeinert und mehrere Zeilen gleichzeitig erhält, um später über sie zu iterieren und mehr Befehle zu senden.

Ich habe versucht, einen Ausgang hinzuzufügen, nachdem die zweite ID gedruckt wurde, aber es war nutzlos, es ist wie es versucht, weiterhin Dinge zu erwarten und hängt dort. Ich habe keine Ahnung, wie man den exp_continue an diesem Punkt abbrechen kann.

expect "OVM> " { 
    send "list ServerPool\r" 
    expect { 
     -re " id:(.*?) (.*?)\n\r" { 
      send_user "$expect_out(1,string)\n"; exp_continue 
     } 
     -re " id:(.*?) (.*?)\n\r" { 
      send_user "\n$expect_out(1,string)\n"; 
     } 
    } 
} 

send "exit\r" 
expect eof 
+0

Warum haben Sie gleiche Regex zweimal? Sie können ein Zeitlimit hinzufügen, um aus der Routine zu kommen. – Ashish

+0

Sind beide IDs gleichzeitig oder einzeln (nachdem Sie einen Befehl gesendet haben, der die erste ID erhält)? – Sharad

+0

Die Liste der IDs kommt sofort. Wenn ich nur einen erwarte, wie du weißt, braucht es nur die erste ID. Ich möchte wissen, wie man die Liste von IDs, wie in einem Array oder etwas, nimmt und sie später in einer Schleife verwendet, um andere Befehle zu senden, die sie benötigen. – Nocturn

Antwort

1

Siehe folgendes Beispiel:

% cat foo.exp 
spawn -noecho cat file 

set idNames {} 
expect { 
    -re {id:([0-9]+) name:([[:alnum:]]+)} { 
     set idName [list $expect_out(1,string) $expect_out(2,string)] 
     lappend idNames $idName 
     exp_continue 
    } 
    "OVM>" {} 
} 

send_user "==== result: ====\n" 
foreach idName $idNames { 
    lassign $idName id name 
    send_user "id=$id name=$name\n" 
} 
% cat file 
OVM> list ServerPool 
Command: list ServerPool 
Status: Success 
Data: 
id:123456789 name:pool1 
id:234567890 name:pool2 
id:345678901 name:pool3 
id:456789012 name:pool4 
id:56789name:pool5 
id:6789name:pool6 
OVM> other command 
% expect foo.exp 
OVM> list ServerPool 
Command: list ServerPool 
Status: Success 
Data: 
id:123456789 name:pool1 
id:234567890 name:pool2 
id:345678901 name:pool3 
id:456789012 name:pool4 
id:56789name:pool5 
id:6789name:pool6 
OVM> other command 
==== result: ==== 
id=123456789 name=pool1 
id=234567890 name=pool2 
id=345678901 name=pool3 
id=456789012 name=pool4 
id=56789name=pool5 
id=6789name=pool6 
%