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ühren cat -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.
grep -Eo $'\e\\[31m[^\e]*\e\\[[03]?m'
Folgende awk
Snippet extrahiert roten Text, auch wenn er mehrzeilig ist.
awk -v RS='\033' '
match($0, /^\[[0-9;]*m/) {
color = ";" substr($0, 2, RLENGTH-2) ";";
$0 = substr($0, RLENGTH+1);
gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
red = (color ~ /1;*$/)
}
red'
In dieser Variante werden die Befehle zum Ändern der Farbe beibehalten. Dies kann hilfreich sein, wenn Sie mehrere Farben (hier Rot und Magenta) filtern.
awk -v RS='\033' '
match($0, /^\[[0-9;]*m/) {
color = ";" substr($0, 2, RLENGTH-2) ";";
printf "\033%s", substr($0, 1, RLENGTH);
$0 = substr($0, RLENGTH+1);
gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
desired = (color ~ /[15];*$/)
}
desired'
>&1
? Ich meine, das rote Zeug verschwindet nicht2>/dev/null
, oder?