Ich verwende ein Dienstprogramm, das keine Möglichkeit zum Filtern der Ausgabe bietet. Nichts im Text der Ausgabe zeigt an, dass eine bestimmte Funktion fehlgeschlagen ist, sie wird jedoch in rot angezeigt. Die Ausgabe ist so lang, dass ich am Ende, wenn einige Fehler gemeldet werden, nicht immer einen Bildlauf durchführen kann, um die Ausgabe zu sehen, bei der der Fehler aufgetreten ist.
Wie kann ich nicht roten Text herausfiltern?
Pseudocode:
dolongtask | grep -color red
Bearbeiten
Der Befehl gibt auch andere Farben aus, und ich muss in der Lage sein , den gesamten Text herauszufiltern , der nicht rot ist. Auch die Textfarbe ist mehrzeilig.
>&1
? Ich meine, das rote Zeug verschwindet nicht2>/dev/null
, oder?Antworten:
Das Umschalten der Farbe erfolgt über im Text eingebettete Escape-Sequenzen . Programme geben ausnahmslos ANSI-Escape-Sequenzen aus , da dies heutzutage von praktisch allen Terminals unterstützt wird.
Die Escape - Sequenz der Vordergrundfarbe auf Rot zu schalten ist
\e[31m
, in dem\e
ein Escape - Zeichen bezeichnet (Oktal 033, hexadezimal 1b, die auch als ESC bekannt,^[
und verschiedene andere Bezeichnungen). Zahlen zwischen 30 und 39 legen die Vordergrundfarbe fest. andere Zahlen setzen andere Attribute.\e[0m
Setzt alle Attribute auf ihren Standardwert zurück. Führencat -v
Sie den Befehl aus, um zu überprüfen, was das Programm druckt. Möglicherweise wird eine Variante verwendet,\e[0;31m
um zuerst alle Attribute zurückzusetzen oder\e[3;31
um auch Kursivschrift zu aktivieren (was von vielen Terminals nicht unterstützt wird).In ksh, bash oder zsh können Sie
$'…'
Backslash-$'\e'
Escape-Zeichen in Anführungszeichen aktivieren , um ein Escape-Zeichen zu erhalten. Beachten Sie, dass Sie dann jeden Backslash verdoppeln müssen, an den Sie übergeben möchtengrep
. In/bin/sh
können Sie"$(printf \\e)"
ein Escape-Zeichen verwenden oder eingeben.Mit der GNU-
grep -o
Option filtert das folgende Snippet roten Text, sofern er mit der Escape-Sequenz\e[31m
beginnt und mit entweder\e[0m
oder endet\e[30m
in derselben Zeile und keine eingebettete Escape-Sequenz enthält.Folgende
awk
Snippet extrahiert roten Text, auch wenn er mehrzeilig ist.In dieser Variante werden die Befehle zum Ändern der Farbe beibehalten. Dies kann hilfreich sein, wenn Sie mehrere Farben (hier Rot und Magenta) filtern.
quelle
printf '\e[31m'; awk …; printf '\e[0m'
Sie können nach Steuerzeichen suchen, von denen einige für die hübschen Farben auf dem Terminal verantwortlich sind.
Dies gibt beispielsweise einen roten "Test" in "grep" wieder, was daran liegt, dass es von Steuerzeichen umgeben ist:
Damit
--color=none
soll nur sichergestellt werden, dass grep nicht seine eigene Farbgebung auf die übereinstimmende Ausgabe anwendet, sondern die gesamte Zeile originalgetreu druckt, sodass Steuerzeichen von der Shell interpretiert werden.quelle
grep -E $'\033\[0?[01];31m.+?\033\[0?0m'
odergrep -Po '\033\[0?[01]+;31m\K.+?(?=\033\[0?0m)'
gezielt auf Rot testen könnte?[[:cntrl:]]
. Ich habe deine getestet und sie arbeiten für mich, dh. passend zu rot und nicht passend zu anderen Farben.