Schnelle Antwort. Mit können Sie tee >(what_to_do) >(another_thing_to_do)
Ihren Befehl für so viele verschiedene Aufgaben ausführen, wie Sie möchten.
Beispiel:
Originalausgabe der Testdatei:
:~$ cat testfile.txt
Device Model: LITEONIT LCS-256M6S 2.5 7mm 256GB
Serial Number: TW0XFJWX550854187616
Ausgabe mit tee
hinzugefügten Befehlen:
:~$ cat testfile.txt | tee >(tail -1) >(wc) >(awk '{print $3,$1,$2}')
Device Model: LITEONIT LCS-256M6S 2.5 7mm 256GB
Serial Number: TW0XFJWX550854187616
LITEONIT Device Model:
TW0XFJWX550854187616 Serial Number:
2 10 91
Serial Number: TW0XFJWX550854187616
Jeder Befehl in tee ist nur ein normaler Befehl, den Sie in der Befehlszeile verwenden würden >(head -1 | wc)
.
:~$ cat testfile.txt | tee >(tail -1) >(head -1 | wc) >(awk '{print $3,$1,$2}')
Device Model: LITEONIT LCS-256M6S 2.5 7mm 256GB
Serial Number: TW0XFJWX550854187616
1 7 52
LITEONIT Device Model:
TW0XFJWX550854187616 Serial Number:
Serial Number: TW0XFJWX550854187616
Oder Sie können auch greifen das letzte Wort in der letzten Zeile sagen von unter Verwendung von awk
mit $NF
mit einem wc
auch wie folgt aus :
:~$ cat testfile.txt | tail -1 | tee >(wc) >(awk '{print $NF}')
Serial Number: TW0XFJWX550854187616
TW0XFJWX550854187616
1 3 39
ANMERKUNG: Das Hinzufügen eines |
Pipe-Befehls am Ende kann die Verwendung mehrerer Befehle aus dem tee
Befehl außer Kraft setzen . Ich habe hier einige Beispiele, die ich getestet habe:
Beispiel 1 (Pipe-Befehl, der alle letzten Wörter zieht):
:~$ echo "This is just five words" | tee >(wc -l) >(wc -w) >(wc -c) | awk '{print $NF}'
words
24
5
1
Beispiel 2 (Zeigt die Ausgabe der wc-Befehle nicht an. Pipe-Befehl greift nach dem 3. Wort.):
:~$ echo "This is just five words" | tee >(wc -l) >(wc -w) >(wc -c) | awk '{print $3}'
just
Beispiel 3 (Ergreifen des 3. Wortes der Echozeile. Tee-Befehl.):
:~$ echo "This is just five words" | tee >(wc -l) >(wc -w) >(wc -c) >(awk '{print $3}')
This is just five words
just
24
5
1
Beispiel 4 (Ergreifen des letzten Wortes der Echozeile. Tee-Befehl.):
:~$ echo "This is just five words" | tee >(wc -l) >(wc -w) >(wc -c) >(awk '{print $NF}')
This is just five words
words
24
5
1
Hoffe das hilft!
tee
ist falsch. Der Grund, warum Sie normalerweise die richtige Reihenfolge erhalten, ist, dass auf einer Niedriglastmaschine der erste Verbraucherprozess zuerst ausgeführt wird. Auf einem geschäftigeren Computer wird der erste Verbraucher möglicherweise in den Ruhezustand versetzt, bevor er etwas drucken kann.tee
hat keine Ahnung von den Verbrauchern - sie werden vonbash
denen erstellt , die die Leitung bearbeiten. Siebash
müssen lediglich die geöffneten Dateideskriptoren kopieren. Darüber hinaus haben Sie mehrere Konsumenten, die in Dateideskriptoren schreiben, die in derselben Datei geöffnet sind. Der Kernel kümmert sich darum, aber die Reihenfolge, in der sie in derbash
Befehlszeile angezeigt werden , spielt sicherlich keine Rolle.Sie müssen
tee
den Stream in Teile teilen. Versuchen:Anmerkungen:
Wenn mehrere Prozesse (
wc
,tail
) in stdout schreiben:Möglicherweise wird die Ausgabe verstümmelt.
Es gibt keine Garantie für die Reihenfolge, in der die Ausgabe erfolgt. Versuchen Sie
sleep 1; wc -w
als den zweiten Verbraucher , um das anzuzeigen.tee
wird blockiert, wenn eines seiner Ziele den Stream nicht schnell genug verbraucht. Das heißt, die Ziele werden mit ungefähr gleicher Geschwindigkeit eingegeben (Modulo der Pufferung mit fester Größe). Es gibt keine einfache Lösung dafür. Die einzige Alternative besteht darin, den Stream in einer Datei zu speichern und ihn separat an die Konsumenten weiterzuleiten. Dennwc
undtail
das ist kein Thema.Für das letzte Wort ist es einfacher:
quelle
Das
moreutils
Paket enthält den Befehlpee
(Zusammenführen von Pipe und Tee, was denkst du?), Der genau das tut.Für Ihr erstes Beispiel verwenden Sie:
Das zweite Beispiel ist komplizierter, da Sie zwei Eingaben an den letzten Befehl übergeben möchten. Ich würde wahrscheinlich
awk
die anderen Antworten verwenden.Link: https://joeyh.name/code/moreutils/
quelle