Ich habe eine Anwendung, die eine große Datenmenge erzeugt, die ich nicht auf der Festplatte speichern möchte. Die Anwendung gibt hauptsächlich Daten aus, die ich nicht verwenden möchte, aber eine Reihe nützlicher Informationen, die in separate Dateien aufgeteilt werden müssen. Zum Beispiel mit der folgenden Ausgabe:
JUNK
JUNK
JUNK
JUNK
A 1
JUNK
B 5
C 1
JUNK
Ich könnte die Anwendung dreimal so ausführen:
./app | grep A > A.out
./app | grep B > B.out
./app | grep C > C.out
Das würde mir das bringen, was ich will, aber es würde zu lange dauern. Ich möchte auch nicht alle Ausgaben in einer einzigen Datei speichern und diese analysieren.
Gibt es eine Möglichkeit, die drei oben gezeigten Vorgänge so zu kombinieren, dass ich die Anwendung nur einmal ausführen muss und trotzdem drei separate Ausgabedateien erhalte?
./app | tee >(grep A > A.out) >(grep B > B.out) | grep C > C.out
grep
.Sie können verwenden
awk
quelle
Sie können auch die Pattern Matching-Fähigkeiten Ihrer Shell verwenden :
Oder auch:
Ein sicherer Weg, um mit Backslashes und Zeilen umzugehen, beginnend mit
-
:Wie @StephaneChazelas in den Kommentaren betont, ist dies nicht sehr effizient. Die beste Lösung ist wahrscheinlich @ AurélienOoms .
quelle
-n
,-e
... Es ist auch schrecklich ineffizient sein würde , da es mehrere Systemaufrufe pro Zeile (ein Mittelread(2)
pro Zeichen, die Datei geöffnet ist, schriftlich für jede Zeile geschlossen ...). Im Allgemeinen ist die Verwendung vonwhile read
Schleifen zum Verarbeiten von Text in Shells eine schlechte Praxis.-n
jetzt mit Backslashes und etc funktionieren . Soweit ich beurteilen kann, funktionieren beide Versionen mit Leerzeichen in Ordnung, irre ich mich?printf
ist das Format. Es gibt keinen Grund, Sie Variablen dort nicht zitiert zu lassen.Wenn Sie mehrere Kerne haben und möchten, dass die Prozesse parallel ablaufen, können Sie Folgendes tun:
Dadurch werden drei Prozesse in parallelen Kernen erzeugt. Wenn eine Ausgabe auf der Konsole oder in einer Masterdatei erfolgen soll, hat dies den Vorteil, dass die Ausgabe in einer bestimmten Reihenfolge bleibt und nicht gemischt wird.
Das Dienstprogramm gnu parallel von Ole Tange kann von den meisten Repos unter dem Namen parallel oder moreutils bezogen werden . Die Quelle kann von Savannah.gnu.org bezogen werden . Auch ein Einführungsvideo ist hier .
Nachtrag
Mit der neueren Version von parallel (nicht unbedingt der Version in Ihrem Distributions-Repository) können Sie das elegantere Konstrukt verwenden:
Dies führt dazu, dass ein ./app- und drei parallele grep-Prozesse in getrennten Kernen oder Threads ausgeführt werden (wie durch parallel selbst bestimmt, betrachten Sie das -j3 ebenfalls als optional, es wird jedoch in diesem Beispiel zu Anleitungszwecken bereitgestellt).
Die neuere Version von parallel erhalten Sie wie folgt:
Dann das übliche entpacken, cd to parallel- {date}, ./configure && make, sudo make installieren. Dadurch werden parallel, man page parallel und man page parallel_tutorial installiert.
quelle
Hier ist eine in Perl:
quelle
... wenn
<in
lesbar, werden alle drei Outfiles abgeschnitten, bevor irgendetwas darauf geschrieben wird.quelle