J'utilise un utilitaire qui n'offre pas de moyen de filtrer sa sortie. Rien dans le texte de la sortie n'indique qu'une fonction particulière a échoué mais elle apparaît en rouge. La sortie est si longue qu'à la fin, quand elle signale un certain nombre d'erreurs, je ne peux pas toujours faire défiler pour voir la sortie où l'erreur s'est produite.
Comment filtrer le texte non rouge?
pseudo code:
dolongtask | grep -color red
Éditer
La commande émet d' autres couleurs aussi bien et je dois être en mesure de filtrer sur tout le texte qui n'est pas rouge. La coloration du texte est également multiligne.
>&1
? Je veux dire, les trucs rouges ne disparaissent pas si vous2>/dev/null
, non?Réponses:
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écutezcat -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 passergrep
. 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.L'
awk
extrait de code suivant extrait du texte rouge, même lorsqu'il est multiligne.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).
la source
printf '\e[31m'; awk …; printf '\e[0m'
Vous pouvez demander à grep de rechercher des caractères de contrôle, dont certains sont responsables de la création des jolies couleurs sur le terminal.
Par exemple, cela fait écho à un "test" rouge dans grep, qui le trouve car il est entouré de caractères de contrôle:
Il
--color=none
s'agit simplement de s'assurer que grep n'applique pas sa propre colorisation à la sortie correspondante, mais imprime fidèlement la ligne entière afin que les caractères de contrôle soient interprétés par le shell.la source
grep -E $'\033\[0?[01];31m.+?\033\[0?0m'
ougrep -Po '\033\[0?[01]+;31m\K.+?(?=\033\[0?0m)'
tester spécifiquement le rouge?[[:cntrl:]]
. J'ai testé le vôtre et ils fonctionnent pour moi, c'est à dire. correspondant au rouge et ne correspondant pas aux autres couleurs.