Marquer les occurrences du mot-clé avec une couleur différente


13

J'ai un programme qui crache une sortie pour stdoutaimer:

[OK]      Something is ok
[OK]      Something else is also ok
[FAIL]    This does not look good
[FAIL]    Neither does this
[OK]      At least this is fine

Pour repérer plus facilement les échecs de la sortie, je voudrais marquer les occurrences du mot clé FAILen rouge sans ignorer les autres messages. Ce serait bien si je pouvais également mettre en évidence les OKmots clés en vert :).

Faire un pipe pour egrep --color FAILn'affichera que les lignes où le FAILmot-clé est présent.


1
Pour une grepsolution, voir unix.stackexchange.com/a/34322
manatwork

avez-vous accès pour changer le code source? est-ce un script bash?
h3rrmiller

@manatwork À partir du lien que vous avez indiqué que je cliqué mon chemin à stackoverflow.com/questions/972370 et avec un peu tail -fet la awkmagie, je suis bon pour aller =)
Theodor

Réponses:


10

Sur la base du manatworkbrillant petit piratage "ou rien" dans l'autre question, je propose ceci, qui ajoute la possibilité d'obtenir deux couleurs de surbrillance:

 $ myprogram | \
   GREP_COLORS='mt=01;32' egrep --color=always '\[OK\]|' | \
   GREP_COLORS='mt=01;31' egrep --color=always '\[FAIL\]|'

Autrement dit, vous exécutez grepdeux fois la sortie, avec une GREP_COLORSvariable d'environnement différente à chaque fois.

La valeur '01; 32 'signifie "vert gras" et l'autre signifie "rouge gras". Voir l' article Wikipedia sur les codes ANSI pour plus d'idées.

Hélas, cela nécessite GNU grep version 2.5.3 ou supérieure. Les versions plus anciennes de GNU grep prenaient en charge un mécanisme de coloration différent, mais ces versions ont un bogue qui vous empêche d'utiliser la fonctionnalité dans un pipeline plus d'une fois. BSD grep émule l'ancien mécanisme de coloration GNP grep, et cela fonctionnera deux fois dans un pipeline, mais il crie à propos de la "sous-expression vide" en raison du manatworkhack.

Vous pouvez supprimer les barres obliques inverses à la fin des deux premières lignes pour en faire une seule ligne. Je viens de le diviser ici pour plus de clarté et pour bien jouer avec le format de page SE.


C'est génial en effet! Mais pour une raison quelconque, le script ne semble pas mettre en évidence la deuxième déclaration sur ma machine. J'utilise CentOS 5.
Theodor

2
Ce qui se passe ici, c'est que CentOS 5 expédie un grep GNU suffisamment ancien pour ne pas le prendre en charge GREP_COLORS, au pluriel. Il utilise GREP_COLORuniquement l'ancienne méthode, et cette méthode contient un bogue qui l'empêche de faire la bonne chose. Si vous modifiez la commande à utiliser GREP_COLOR=32et ainsi de suite, cela changera la couleur de surbrillance de la première correspondance uniquement. Si vous dirigez le résultat, hexdump -cvous pouvez voir que l'ajout de la deuxième egrepcommande fait quelque chose, mais ce n'est pas ANSI légal. Conclusion: vous devez mettre grepà niveau pour que cela fonctionne correctement.
Warren Young

Haha, c'est un commentaire si perspicace. Ouais, CentOS5 vieillit un peu, comme avec de nombreux OS: s fonctionnant sur une vieille machine crachant des messages de journaux anciens et abandonnés :) J'essaierai de voir si une mise à niveau vers centos6 n'est pas possible.
Theodor

Je viens de vérifier ma solution sur une CentOS 6 boîte, et il ne travail là - bas, ce qui confirme mon diagnostic. (Les tests antérieurs étaient sur des serveurs Ubuntu.) EL6 est livré avec GNU grep 2.6.3. Fait intéressant, ils ont également corrigé le GREP_COLORbug (singulier), même si la fonctionnalité était obsolète dès qu'elle avait été remplacée.
Warren Young

Je ne comprends pas comment cela résout le problème car le 1er grep filtrera tous les "FAIL" donc il ne restera plus rien pour que le deuxième grep corresponde ..
laertis

1

Vous pouvez utiliser multitail ou ccze pour cela, les deux permettent aux configurations de décrire les expressions rationnelles pour correspondre et les couleurs.


1

Sur la base de la réponse de Warren Young, j'ai écrit ce script Python qui fait la même chose plus élégamment et avec beaucoup moins de frappe. Voici donc comment utiliser ce script:

cat yourfile | himul '\[OK\]' '\[FAIL\]'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.