Ich möchte mehrere Teile aus einer Datei ziehen oder zumindest in einer Protokolldatei nach Teilen suchen, falls diese auftreten sollten, aber ich möchte nicht mehrere tail | grep
Sitzungen einrichten. Stattdessen möchte ich einfach die Ausgabe jedes Greps verfolgen.
Ich nehme an, ich könnte dies mit machen awk
, aber vielleicht gibt es bereits etwas, das dieser Idee näher kommt.
Der Befehl könnte beispielsweise so aussehen:
tail -f /var/log/syslog | teegrep cron1 -f CRON | teegrep cloud-init2 -f CLOUD-INIT
Die Ausgabe wären die Dateien CRON und CLOUD-INIT, wobei am Ende alles auf stdout verschoben würde. Nur die Übereinstimmungen für die Zeilen „cron1“ und „cloud-init2“ würden in den jeweiligen Dateien landen.
Vielleicht ist es bereits Teil eines Befehls und ich habe es einfach nicht gewusst. Oder vielleicht nur ein Bash/Zsh-Trick, der dasselbe bewirkt. So oder so: Gibt es einen Befehl, der kombiniert tee
und grep
so dass in einer Pipeline der T-Teil Übereinstimmungen an eine Datei weiterleiten kann?
Antwort1
Angenommen, es handelt sich um eine Shell mit Prozesssubstitutionen >(...)
:
tail -f /var/log/syslog |
tee >(grep cron1 >CRON) |
tee >(grep cloud-init2 >CLOUD-INIT)
Dies würde dazu führen, tail
dass Daten für den ersten tee
in der Pipeline erzeugt werden. Dieser tee
würde die Daten duplizieren und eine Kopie an den nächsten tee
und die andere an einen Prozesssubstitutionsprozess senden. Dieser Prozesssubstitutionsprozess würde grep
auf den von eingehenden Daten ausgeführt tee
und das Ergebnis würde in die Datei gehen CRON
.
Die letzte Stufe der Pipeline würde auf ähnliche Weise funktionieren.
In einer Shell, in der Prozesssubstitutionen nicht verfügbar sind, könnten beispielsweise /bin/sh
oder awk
verwendet sed
werden.
Mit awk
:
tail -f /var/log/syslog |
awk '{ print }
/cron1/ { print >"CRON" }
/cloud-print/ { print >"CLOUD-INIT" }'
Mit sed
(beachten Sie, dass wir sicherstellen müssen, dass die Ausgabedateien nicht existieren, da der w
Befehl in sed
immer Daten an eine Datei anhängt):
rm -f CLOUD CLOUD-INIT
tail -f /var/log/syslog |
sed -e '/cloud/w CLOUD' \
-e '/cloud-print/w CLOUD-INIT'