Le changement de couleur se fait via des séquences d'échappement intégrées dans le texte. Invariablement, les programmes émettent des séquences d'échappement ANSI , car c'est ce que pratiquement tous les terminaux prennent en charge de nos jours.
La séquence d'échappement pour passer la couleur de premier plan au rouge est \e[31m
, où \e
désigne un caractère d'échappement (octal 033, hexadécimal 1b, également connu sous le nom ESC, ^[
et diverses autres désignations). Les nombres compris entre 30 et 39 définissent la couleur de premier plan; d'autres nombres définissent des attributs différents. \e[0m
réinitialise tous les attributs à leur valeur par défaut. Exécutez cat -v
pour vérifier ce que le programme imprime, il peut utiliser une variante telle que \e[0;31m
réinitialiser d'abord tous les attributs, ou \e[3;31
également activer l'italique (que de nombreux terminaux ne prennent pas en charge).
Dans ksh, bash ou zsh, vous pouvez utiliser $'…'
pour activer les échappements antislash à l'intérieur des guillemets, ce qui vous permet de taper $'\e'
pour obtenir un caractère d'échappement. Notez que vous devrez ensuite doubler toute barre oblique inverse à laquelle vous souhaitez passer grep
. Dans /bin/sh
, vous pouvez utiliser "$(printf \\e)"
ou saisir un caractère d'échappement littéral.
Avec l' grep -o
option GNU , l'extrait de code suivant filtre le texte rouge, en supposant qu'il commence par la séquence d'échappement \e[31m
, se termine par l'une \e[0m
ou \e[30m
la même ligne et ne contient aucune séquence d'échappement intégrée.
grep -Eo $'\e\\[31m[^\e]*\e\\[[03]?m'
L' awk
extrait de code suivant extrait du texte rouge, même lorsqu'il est multiligne.
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'
Voici une variante qui conserve les commandes de changement de couleur, ce qui pourrait être utile si vous filtrez plusieurs couleurs (ici le rouge et le magenta).
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
? Je veux dire, les trucs rouges ne disparaissent pas si vous2>/dev/null
, non?