Ich versuche, die Ausgabe einer Protokolldatei auf der Grundlage eines Grep-Filters in getrennte Protokolldateien zu filtern.
tail -f test.log | tee> (grep "Error"> error.log)> (grep "Warning" "> warning.log)
Auf diese Weise befinden sich alle "Fehler" -Einträge in einer Datei und alle "Warnung" -Einträge in einer separaten Datei.
Ich weiß, dass dies im Konzept funktioniert, da ich, wenn ich cat anstelle von tail verwende , die richtige Dateiausgabe erhalte, aber Änderungen nicht in Echtzeit nachverfolgen kann (was ich brauche, weil ich Ausgabeprotokolle von aktiv ausgeführten Tests beobachte).
Auch wenn ich die '>' Dateireferenten aus den grep- Befehlen entferne, werden die einzelnen grep-Ausgaben korrekt an die Konsole ausgegeben. Ich möchte jedoch auch eine aufgezeichnete Datei.
Antworten:
Beim Schreiben in eine Datei wurde die Ausgabe von grep gepuffert. Die Verwendung von egrep mit der Option --line-buffer hat das Verhalten behoben.
Der neue Befehl sieht folgendermaßen aus:
tail -f test.log | tee> (egrep - zeilengepuffertes "ERROR"> error.log)> (egrep - zeilengepuffertes "WARNING"> warning.log)
Antworten:
Es ist möglicherweise einfacher, wenn Sie dazu mehr als eine Zeile verwenden. Sie könnten ein Bash-Skript schreiben:
quelle
@ Ryan, vielen Dank für die Beantwortung Ihrer Frage.
Eine andere (universelle) Möglichkeit, die Pufferung pro Zeile festzulegen, ist die Verwendung des
stdbuf
Befehls:Hier ist ein Auszug aus
man stdbuf
:quelle