
Ich habe ein Shell-Skript, das zwischen zwei Daten Details aus einer Protokolldatei extrahiert und einen Befehl auf der Ausgabe ausführt, um einen Bericht zu generieren. Die Protokolldateien befinden sich auf verschiedenen Servern und die Skripte werden auf verschiedenen Servern ausgeführt. Das Skript sieht folgendermaßen aus:
#!/bin/sh
time1=$1
time2=$2
echo `ssh -i key user@ip -yes cat file | awk '{if(substr($4,2)>="'$time1'" && substr($4,2)<="'$time2'") print $0;}'` > tmp.log
`cat tmp.log | some operation to get detail`
Die Ausgabe sollte ungefähr wie folgt aussehen:
ip1 date1 - - request1 file1 method1 status1
ip2 date2 - - request2 file2 method2 status2
d. h. mehrere Zeilen, aber die generierte Ausgabe ist eine einzelne Zeile, die alle Details enthält, wie:
ip1 date1 - - request1 file1 method1 status1 ip2 date2 - - request2 file2 method2 status2
Wenn derselbe Befehl direkt auf dem Server ausgeführt wird, wird die gewünschte Ausgabe generiert, bei Remote-Ausführung jedoch nicht.
Meine Frage ist also, wie ich die richtige Ausgabe erhalte und ob dies eine gute Möglichkeit ist, dies zu tun?
Antwort1
Wie an verschiedenen Stellen erklärt (wie hierhttp://unix.derkeiler.com/Newsgroups/comp.unix.shell/2007-05/msg00584.html) echo gibt seine Argumente durch Leerzeichen getrennt aus
Daher muss man entweder das Ergebnis des Befehls in den Backticks als ein Argument übergeben
echo "`some command that outputs multiple lines here`"
Oder nicht verwenden echo
, sondern zum Beispielprintf