Das Senden des GREP-Befehls schlägt fehl

781
Dalman

Ich bin neu und erwarte das Scripting und versuche, unterhalb des Skripts zu arbeiten. Das Skript meldet sich bei einem Server an und liest eine Konfigurationsdatei ($ val im Skript) für die Werte von "cps" und stellt dann einen Gesamtwert dar. Beim Senden eines langen "grep" -Befehls, den ich in 2 Teile geteilt habe, blieb er jedoch hängen :

set cmd1 "grep -A200 \"_ims\""   set cmd2 { | grep -B3 "calledUserDescriptor" | grep "cps" | grep -v "//cps" | awk '{ SUM += $3} END { print "total sip cps = "SUM}' >> cps.txt} 

Die Ausführung endet um:

exp_send "$cmd1 $val $cmd2\r" 

hier wird nur der 1. Teil ($ cmd1 $ val) ausgeführt, der 2. Teil ( $cmd2) sendet als separater Befehl und schlägt bei "|" fehl mit Nachricht:bash: syntax error near unexpected token |'

Der Befehl grep` funktioniert einwandfrei, wenn er direkt unter Linux ausgeführt wird. Ich nehme an, es gibt einen Fehler (Syntax?) In der Zeile exp_send, aber ich habe nicht herausgefunden, wie man es richtig macht, es gibt sicher einen besseren Weg, dies zu tun. Dies ist das eigentliche Skript:

#!/usr/bin/expect -f  set lnk1 "Traffic_ims.cfg"  set cmd1 "grep -A200 \"_ims\""  set cmd2 { | grep -B3 "calledUserDescriptor" | grep "cps" | grep -v "//cps" | awk '{ SUM += $3} END { print "total sip cps = "SUM}' >> cps.txt}   set file1 "/tmp/cps.txt"  set cmd3 "cd /home/traffic/"  set cmd4 "readlink"  set passwd "xxxxx"  log_user 1  spawn rm -rf $file1  spawn ssh user@192.24.135.166  expect {  -re ".*Are.*.*yes.*no.*" {  send "yes\n"  exp_continue  }  "*?assword:*" {  send $passwd  send "\n"  }  }  expect "*\$ "  exp_send "$cmd3\r"  expect "$cmd3\r"  expect -re $  exp_send "$cmd4 $lnk1\r"  expect "$cmd4 $lnk1\r"  expect -re "(Titan.*)\r"  set val $expect_out(0,string)   exp_send "$cmd1 $val $cmd2\r"  expect -re "(.*)\r"  set output [open "/tmp/cps.txt" "a+"]  set outcome $expect_out(buffer)  send "\r"  puts $output $outcome  close $output   exp_send "exit \r"  exit 0  
1
Endet der Inhalt von $ val mit einem \ r? Lesen Sie aus einer Datei, die DOS-Zeilenenden hat? glenn jackman vor 9 Jahren 0
Hallo Glenn, danke, dass Sie sich die Zeit für eine Antwort genommen haben. Der Wert von $ val ist der Name einer Textdatei. Beispiel: ts1455_TrafficMix_ims.cfg Der Inhalt dieser Datei ist in Klartext. Dalman vor 9 Jahren 0

1 Antwort auf die Frage

0
glenn jackman

Ich glaube ich habe recht

expect -re "(Titan.*)\r"  set val $expect_out(0,string)  

expect_out(0,string) enthält die gesamte Übereinstimmung, nicht nur das Bit in Klammern.

Versuchen:

set val $expect_out(1,string) 

um nur auszuwählen, was mit dem Muster in (dem ersten Satz von) Klammern übereinstimmt.