Gibt es einen Befehl, der „tee“ und „grep“ kombiniert, sodass der „tee“-Teil in einer Pipeline Übereinstimmungen an eine Datei weiterleiten kann?

Gibt es einen Befehl, der „tee“ und „grep“ kombiniert, sodass der „tee“-Teil in einer Pipeline Übereinstimmungen an eine Datei weiterleiten kann?

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 | grepSitzungen 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 teeund grepso 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, taildass Daten für den ersten teein der Pipeline erzeugt werden. Dieser teewürde die Daten duplizieren und eine Kopie an den nächsten teeund die andere an einen Prozesssubstitutionsprozess senden. Dieser Prozesssubstitutionsprozess würde grepauf den von eingehenden Daten ausgeführt teeund 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/shoder awkverwendet sedwerden.

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 wBefehl in sedimmer 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'

verwandte Informationen