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 \eein 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[0mSetzt alle Attribute auf ihren Standardwert zurück. Führen cat -vSie den Befehl aus, um zu überprüfen, was das Programm druckt. Möglicherweise wird eine Variante verwendet, \e[0;31mum zuerst alle Attribute zurückzusetzen oder \e[3;31um 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/shkönnen Sie "$(printf \\e)"ein Escape-Zeichen verwenden oder eingeben.
Mit der GNU- grep -oOption filtert das folgende Snippet roten Text, sofern er mit der Escape-Sequenz \e[31mbeginnt und mit entweder \e[0moder 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?