Markieren Sie Vorkommen von Schlüsselwörtern mit einer anderen Farbe

13

Ich habe ein Programm, das eine Ausgabe ausgibt, die mir stdoutgefällt:

[OK]      Something is ok
[OK]      Something else is also ok
[FAIL]    This does not look good
[FAIL]    Neither does this
[OK]      At least this is fine

Um die Fehler in der Ausgabe leichter zu erkennen, möchte ich die Vorkommen des Schlüsselworts FAILmit Rot markieren, ohne die anderen Nachrichten zu verwerfen. Es wäre schön, wenn ich die OKKeywords auch mit grün markieren könnte :).

Wenn Sie eine Pipe für ausführen, egrep --color FAILwerden nur die Zeilen angezeigt, in denen das FAILSchlüsselwort vorhanden ist.

Theodor
quelle
1
Eine grepLösung finden Sie unter unix.stackexchange.com/a/34322
manatwork
Haben Sie Zugriff, um den Quellcode zu ändern? Ist es ein Bash-Skript?
h3rrmiller
@manatwork Aus dem Link von Ihnen angegebene ich meinen Weg zu geklickt stackoverflow.com/questions/972370 und mit einigen tail -fund awkMagie, bin ich gut zu gehen =)
Theodor

Antworten:

10

Basierend auf manatworkdem brillanten kleinen "oder nichts" -Hack in der anderen Frage, biete ich dies an, was die Fähigkeit hinzufügt, zwei Hervorhebungsfarben zu erhalten :

 $ myprogram | \
   GREP_COLORS='mt=01;32' egrep --color=always '\[OK\]|' | \
   GREP_COLORS='mt=01;31' egrep --color=always '\[FAIL\]|'

Das heißt, Sie durchlaufen grepdie Ausgabe zweimal mit jeweils einer anderen GREP_COLORSUmgebungsvariablen.

Der Wert '01; 32 'bedeutet "fett grün" und der andere bedeutet "fett rot". Weitere Ideen finden Sie im Wikipedia- Artikel zu ANSI-Codes .

Leider erfordert dies GNU grep Version 2.5.3 oder höher. Ältere Versionen von GNU grep unterstützten einen anderen Farbmechanismus, aber diese Versionen haben einen Fehler, der Sie daran hindert, die Funktion in einer Pipeline mehr als einmal zu verwenden. BSD grep emuliert den älteren GNU grep-Färbemechanismus und wird in einer Pipeline zweimal funktionieren, aber es schreit wegen des manatworkHacks nach "leerem Unterausdruck" .

Sie können die umgekehrten Schrägstriche am Ende der ersten beiden Zeilen entfernen, um eine einzelne Zeile zu erstellen. Ich habe es hier nur aus Gründen der Klarheit und zum Spielen mit dem SE-Seitenformat aufgeteilt.

Warren Young
quelle
Das ist in der Tat brillant! Aber aus irgendeinem Grund scheint das Skript die zweite Anweisung auf meinem Computer nicht hervorzuheben. Ich lasse CentOS 5 laufen.
Theodor
2
Was hier passiert, ist, dass CentOS 5 ein GNU-Grep liefert GREP_COLORS, das alt genug ist, dass es keinen Plural unterstützt. Es wird nur die ältere GREP_COLORMethode verwendet, und diese Methode enthält einen Fehler, der verhindert, dass sie das Richtige tut. Wenn Sie den zu verwendenden Befehl GREP_COLOR=32und einen solchen ändern, ändert sich die Hervorhebungsfarbe nur für die erste Übereinstimmung. Wenn Sie das Ergebnis weiterleiten hexdump -c, können Sie feststellen, dass das Hinzufügen des zweiten egrepBefehls zwar etwas bewirkt, jedoch nicht für ANSI zulässig ist. Fazit: Sie müssen ein Upgrade durchführen grep, damit dies funktioniert.
Warren Young
Haha, das ist so ein aufschlussreicher Kommentar. Ja, CentOS5 ist in die Jahre gekommen, wie es bei vielen Betriebssystemen der Fall ist, die auf alten Rechnern laufen und alte, gottverlassene Logmeldungen ausspucken :) Ich werde versuchen zu sehen, ob ein Upgrade auf Centos6 nicht möglich ist.
Theodor
Ich habe gerade meine Lösung auf einer CentOS 6-Box überprüft und sie funktioniert dort und bestätigt meine Diagnose. (Frühere Tests wurden auf Ubuntu-Servern durchgeführt.) EL6 wird mit GNU grep 2.6.3 ausgeliefert. Interessanterweise haben sie auch den GREP_COLOR(singulären) Fehler behoben, obwohl das Feature veraltet war, sobald es ersetzt wurde.
Warren Young
Ich kann nicht verstehen, wie dies das Problem löst, da der erste Grep alle "FEHLER" herausfiltert, so dass für den zweiten
Grep
1

Sie können hierfür Multitail oder ccze verwenden. Beide erlauben es Configs, passende Regexps und Farben zu beschreiben.

Netch
quelle
1

Basierend auf der Antwort von Warren Young habe ich dieses Python-Skript geschrieben , das das Gleiche eleganter und mit viel weniger Tippaufwand ausführt. So würden Sie dieses Skript verwenden:

cat yourfile | himul '\[OK\]' '\[FAIL\]'
kirubakaran
quelle