Ich konnte tail -f
mit dem Befehl eine Ausgabe mit Farben erstellen awk
. Aber ich bin mir nicht sicher, wie ich den Rest des Protokolls ausgeben soll, da anscheinend nur diese beiden Zeilen gefiltert werden. Ich möchte auch die anderen Zeilen sehen, während das Protokoll geschrieben wird.
Was muss ich in den awk
Befehl eingeben, um den Rest der Ausgabe anzuzeigen?
Bild meines Problems. Der rote Text oben ist ohne Verwendung awk
und zeigt das gesamte an tail -f log
. Und darunter ist derselbe Befehl mit der awk
Farbfilterung.
Antwort1
Anstatt passende Linien mit Verzierungen zu drucken, verzieren Sie passende Linien und drucken Sie alles:
awk '/User@Host:/ { $0 = "\033[32m" $0 "\033[39m" }; /Query_time:/ { $0 = "\033[29m" $0 "\033[39m" }; 1'
Dieses awk
Programm besteht aus drei Mustern und zugehörigen Aktionen:
- Übereinstimmende Zeilen
User@Host:
werden mit verarbeitet$0 = "\033[32m" $0 "\033[39m"
, wobei die aktuelle Zeile mit den angegebenen Escape-Codes umschlossen wird. - Übereinstimmende Zeilen
Query_time:
werden mit verarbeitet$0 = "\033[29m" $0 "\033[39m"
; - Zeilen, deren Muster
1
ungleich Null ist (also alle Zeilen), werden mit der Standardaktion verarbeitet, die darin besteht, die aktuelle Zeile zu drucken.
Diese sind kumulativ: Alle Aktionen, deren Muster mit der aktuellen Zeile übereinstimmen, werden in der Reihenfolge ausgeführt, in der sie definiert sind. Eine übereinstimmende Zeile User@Host:
wird geändert (erste Aktion) und gedruckt (dritte Aktion). Eine übereinstimmende Zeile Query_time:
wird geändert (zweite Aktion) und gedruckt (dritte Aktion). Eine Zeile, die mit keinem der beiden übereinstimmt, wird gedruckt (dritte Aktion).
Das ist die einfachste Technik, um alle Zeilen zu drucken, ohne nachverfolgen zu müssen, ob eine Zeile bereits verarbeitet wurde (um das zweimalige Drucken einer Zeile zu vermeiden). Anstatt in jedem Satz von Aktionsanweisungen etwas zu drucken, ändern wir die aktuelle Zeile entsprechend und drucken sie nur einmal (aber immer).