Logdatei mit sed/awk einfärben

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Logdatei mit sed/awk einfärben

Beitrag von MartinV » 26.11.2017 02:26:54

Ich habe sehr lange Logausgaben, die ich farblich verändern will, um Fehler schneller zu finden.
Eine funktionierende Lösung habe ich:

Code: Alles auswählen

tail  -F $Logfile | awk '/==>/ {print "\033[4m" $0 "\033[0m"; next} 1 {print}' | \
                            sed -e /ERROR/s//$(printf "\033[41;1m&\033[0m")/g \
                               -e /Error/s//$(printf "\033[41;1m&\033[0m")/g \
                               -e /Failed/s//$(printf "\033[41;1m&\033[0m")/g \
                               -e /x11docker:/s//$(printf "\033[32;1m&\033[0m")/ 
awk unterstreicht alle Zeilen, die mit ==> anfangen.
sed färbt die Wörter ERROR, Error und Failure rot.
Das Wort x11docker: wird grün gefärbt. (Eigentlich sollte es nur grün sein, wenn es am Zeilenanfang steht, aber ich will meine Wünsche nicht zu weit treiben)

Ich würde das gern optimieren.
Vor allem denke ich, daß nur entweder awk oder sed zum Einsatz kommen sollten, nicht beide.

Könnt Ihr mich beraten? Ich bin nicht allzu firm mit sed und awk, und bastel mir meist aus Websuchergebnissen irgendwas zusammen, bis es geht :roll: . Von Optimierung oder Performance bin ich da noch weit weg.
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: Logdatei mit sed/awk einfärben

Beitrag von Liffi » 26.11.2017 07:48:52

Vielleicht kannst du das auch mit lnav realisieren. Wenn es denn auch ein anderes tool sein darf. Da könntest du deine eigene Syntax Datei hinterlegen, die genau das Verhalten realisiert und dir noch mehr Komfort bietet.

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: Logdatei mit sed/awk einfärben

Beitrag von detix » 26.11.2017 09:38:45

Debianpython-pygments könnte was für dich sein.
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Benutzeravatar
maltris
Beiträge: 292
Registriert: 27.08.2011 12:54:23
Lizenz eigener Beiträge: MIT Lizenz
Kontaktdaten:

Re: Logdatei mit sed/awk einfärben

Beitrag von maltris » 26.11.2017 10:35:58

Debiancolorize könnte das sein, was du suchst. Gibts auf GitHub [1] und für buster und sid auch als Paket.

744

[1] https://github.com/raszi/colorize

Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: Logdatei mit sed/awk einfärben

Beitrag von MartinV » 26.11.2017 12:44:54

Danke für Eure Tips! :)

Ich hätte dazu schreiben sollen, ich will nur mit Bordmitteln arbeiten, die ich auf jedem Linux antreffen kann. Also keine Tools, die ich zusätzlich installieren muß.
sed und awk sind imho immer gegeben.
Die Logfileausgabe ist Teil eines Skriptes, das mit möglichst wenig Abhängigkeiten auf möglichst vielen verschiedenen Systemen laufen soll.

Mir geht es mehr darum, das vorhandene sed/awk zu optimieren.
Optimieren in dem Sinne, daß nur entweder sed oder awk verwendet wird (nicht beide), und insgesamt so performant wie möglich, um CPU-Last und Ausgabeverzögerung so klein wie möglich zu halten.
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: Logdatei mit sed/awk einfärben

Beitrag von MartinV » 26.11.2017 14:28:26

Ich bin der Sache etwas näher gekommen, die Ausgabe ist jetzt spürbar performanter:

Code: Alles auswählen

 sed -e /ERROR/s//$(printf "\033[41;1m&\033[0m")/g \
     -e /Error/s//$(printf "\033[41;1m&\033[0m")/g \
     -e /Failed/s//$(printf "\033[41;1m&\033[0m")/g \
     -e /'^==>'/s//$(printf "\033[4m&")/ \
     -e /'<=='/s//$(printf "&\033[0m")/ \
     -e /^x11docker:/s//$(printf "\033[32;1m&\033[0m")/
Die unterstrichenen Zeilen macht jetzt auch sed, awk ist raus. Die Zeilen beginnen mit ==> und enden mit <==. Verbesserungsbedarf: Anstatt beide Stichwörter zu suchen und jeweils einen Farbcode zu setzen, wäre es besser, nur nach ==> am Zeilenanfang zu suchen und daraufhin den Farbcode für die ganze Zeile zu setzen. Wie geht das?

x11docker: wird nur noch am Zeilenanfang gefärbt dank ^

Die dreifache Abfrage für ERROR Error Failed ist noch hampelig. Alle drei werden in rot eingefärbt. Geht das auch mit nur einer Abfrage?

Kann man printf ganz weglassen und das anders lösen?
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: Logdatei mit sed/awk einfärben

Beitrag von MartinV » 26.11.2017 16:28:12

Noch etwas besser:

Code: Alles auswählen

Escape=$(printf '\033')
tail -F $Logfile | sed "s/ERROR/${Escape}[41mERROR${Escape}[0m/g; \
     s/Error/${Escape}[41mError${Escape}[0m/g; \
     s/Failed/${Escape}[41mFailed${Escape}[0m/g; \
     s/^==>/${Escape}[4m==>/; \
     s/<==/<==${Escape}[0m/; \
     s/^x11docker:/${Escape}[32mx11docker:${Escape}[0m/" 
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Logdatei mit sed/awk einfärben

Beitrag von Cae » 26.11.2017 16:45:35

Code: Alles auswählen

Escape="$(printf '\033')"
tail -F $Logfile | sed "
	s/\(ERROR\|Error\|Failed\)/${Escape}[41m\1${Escape}[0m/g;
	s/^==>.*/${Escape}[4m\0${Escape}[0m/;
	s/^x11docker:/${Escape}[32m\0${Escape}[0m/
"
\0 im replacement-Teil der substitute-Anweisung expandiert zur kompletten Zeile, das nutze ich bei den letzten beiden Faellen aus. \1 expandiert zum ersten Match eines Subausdrucks bzw. \x zum x-ten. RegEx-Subausdruecke sind in Klammern, im sed sind sie zu escapen. Die escapte Pipe | trennt Auswahlmoeglichkeiten voneinander.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Logdatei mit sed/awk einfärben

Beitrag von Cae » 26.11.2017 16:59:01

Ah und fuer das printf gibt's auch die offentsichtliche Loesung, den Escape-Code direkt in den sed-Code hineinzuschreiben. Ebenfalls in der sed-genehmen Syntax, und zwar hexadezimaler Schreibweise anstatt oktal:

Code: Alles auswählen

$ printf '\033 \x1b\n' | cat -A
^[ ^[$
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: Logdatei mit sed/awk einfärben

Beitrag von MartinV » 27.11.2017 19:03:42

Vielen Dank, Cae!
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Benutzeravatar
Meillo
Moderator
Beiträge: 9230
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Logdatei mit sed/awk einfärben

Beitrag von Meillo » 27.11.2017 19:24:59

Zur Ergaenzung: sed(1) ist auf jedem Unix anzutreffen, awk(1) nicht zwangslaeufig (bei der Minimalinstallation von Debian muss es AFAIR erst noch dazu installiert werden). Auch POSIX fordert ein sed(1), sieht awk(1) aber als optionale Erweiterung.

Nicht dass es euch interessieren wuerde, aber oktal/hex-Escapes sind nicht Teil von POSIX, ebenso Alternationen und was sonst noch ueber BREs hinaus geht. GNU sed kann das natuerlich alles, evtl. muss man dazu `-r' angeben.

Btw: Da [ kein valides Identifierzeichen in der Shell ist, kann man sich die geschweiften Klammern bei ${Escape} sparen. Ich wuerde die Variable nur $e nennen, was dann zu sowas wie $e[41m fuehrt ... IMO ist das weniger Noise und mehr Signal ... aber da scheiden sich fuer gewoehnlich die Geister. :-)
Use ed once in a while!

Antworten