2016-04-28 6 views
-2

Ich habe eine Eingabedatei, input.txt, und ich möchte einen Befehl ausführen, der zwei Werte von input.txt lesen soll. Nehmen wir an, der Quellenname und der Zielname sollten aus der Eingabe gelesen werden, und der gleiche Befehl soll basierend auf input.txt tausendmal wiederholt werden.shell script zum mehrmaligen Ausführen von Befehlen Lesen von Werten aus der Eingabedatei

Auch die Ausgabe des Befehls für jede ist in separaten Protokoll gespeichert werden. Ist dies mit einer einzelnen Eingabedatei möglich oder müssen wir 2 Dateien für Quelle und Ziel verwenden? Ich fordere Sie auf, ein Shell-Skript zur Verfügung zu stellen, um dies zu erreichen, da ich im Shell-Scripting schlecht bin. Ich habe versucht das unten, was nicht funktioniert.

while read i j; do 
    command $i $j 
done > output.txt 

Antwort

1

Sicher. Angenommen, dies ist input.txt:

source1.txt dest1.txt 
source2.txt dest2.txt 
... 

Und Sie wollen, dies zu tun:

command source1.txt dest1.txt 
command source2.txt dest2.txt 
... 

Hier ist ein Weg:

while read i o; do 
    command $i $o 
done < input.txt 

Dies setzt voraus, dass Befehl command bereits aufgebaut lesen von ihm zuerst ist Argument und schreibe zu seinem zweiten. Wenn command stattdessen auf stdout (d. H. Auf den Terminalbildschirm) gedruckt wird, ersetzen Sie command $i $o durch command $i > $o. Dies setzt auch voraus, dass es in input.txt keine Leerzeichen oder witzige Zeichen gibt.

Es gibt auch einen Weg, der wesentlich schneller sein wird, wenn Ihr input.txt z. Millionen von Zeilen oder mehr:

awk '{printf "command %s\n", $0}' input.txt | sh 

Oder, wenn Sie command $i > $o verwenden müssen: Diese

awk '{printf "command %s > %s\n", $1, $2}' input.txt | sh 

Methode liest Zeilen aus input.txt und druckt command source1.txt dest1.txt für die erste Zeile, command source2.txt dest2.txt für die zweiten, usw. ... Dann "pipes" (|) diese Befehle an sh, die sie ausführt.

Für Fehler in command Handhabung versuchen:

while read i o; do 
    command $i $o || command2 $i $o >> command2.log 
done < input.txt 2> error.log 

Oder:

done <input.txt> error.log 2>&1 

(Eines davon wird besser funktionieren, je nachdem, ob command und command2 Druck auf stdout ihre Fehler (1) oder stderr (2).)

+0

Danke Webb, ich habe es versucht, es funktioniert. aber ich hatte Fehler in einigen Befehlen, gibt es irgendeine Möglichkeit, das Ergebnis zu überprüfen und wenn es fehlschlägt, sollten wir den Befehl mit geringfügigen Änderungen selbst ausführen. Führt auch nach jedem Befehl die Protokolldetails aus, die in eine Protokolldatei geladen werden sollen. Wie unten, während ich gelesen habe; tun Befehl $ i $ o \t, wenn das Ergebnis (gut) \t nächste Iteration \t sonst \t command2 $ i $ o < input.txt > Ausgabe log.txt – Hemanth

+0

getan hinzugefügt angeforderten Fehlerbehandlung – webb

0

Sagen Sie verschiedene Ausgänge in verschiedenen Dateien, dann auf Protokolldatei pro Befehl und eine Fehlerdatei pro Befehl wollen:

while read i o; do 
    command $i $o 2>"$i$o.err" >"$i$o.log" 
done < input.txt 

Fehler und melden Sie sich in derselben Datei: stderr zu stdout dank 2>&1 umgeleitet wird:

while read i o; do 
    command $i $o 2>&1 >"$i$o.log" 
done < input.txt 

können Sie auch alle in derselben Datei haben output.log:

echo "" > output.log 
while read i o; do 
    command $i $o 2>&1 >> output.log 
done < input.txt 
Verwandte Themen