Grep sortie avec plusieurs couleurs?

Existe-t-il une méthode élégante en bash pour exécuter grep sur un fichier texte avec 2 motifs ou plus, et chaque motif correspondant est affiché dans une couleur différente?

Donc, une ligne qui correspond à MALE et AUGUST sortirait MALE en bleu et AUGUST en orange? Je suis ouvert à l’utilisation de sed , awk , grep et crayons ou autres …

Vous pouvez utiliser des couleurs différentes en spécifiant –color = always et en utilisant l’expression régulière ‘foo | $’ pour passer toutes les lignes.

Par exemple:

 tail -f myfwlog | GREP_COLOR='01;36' egrep --color=always 'ssh|$' | GREP_COLOR='01;31' egrep -i --color=always 'drop|deny|$' 

Si vous souhaitez que la ligne entière soit mise en évidence, mettez à jour votre expression régulière en conséquence:

 .... GREP_COLOR='01;31' egrep -i --color=always '^.*drop.*$|^.*deny.*$|$' 

grep est un matcher d’expression régulière, pas un surligneur de syntaxe :). Vous devrez utiliser plusieurs appels de grep , en utilisant une valeur différente de GREP_COLOR pour chacun.

 GREP_COLOR="1;32" grep foo file.txt | GREP_COLOR="1;36" grep bar 

Cela mettrait en évidence “foo” et “bar” dans des couleurs différentes dans les lignes qui correspondent aux deux. Je ne pense pas qu’il existe un moyen (simple) de gérer toutes les occurrences de l’un ou l’autre modèle, à moins de fusionner le stream de sortie de deux appels indépendants:

 { GREP_COLOR="1;32" grep foo file.txt GREP_COLOR="1;36" grep bar file.txt } | ... 

ce qui sera évidemment différent que s’il y avait un moyen d’atsortingbuer une couleur distincte à chaque expression régulière.


Vous pouvez utiliser awk pour remplacer chaque match par lui-même, enveloppé dans le code de contrôle correct.

  echo "foo bar" | awk '{ gsub("bar", "\033[1;33m&\033[0m"); gsub("foo", "\033[1;36m&\033[0m"); print }' 

Dans chaque ligne, vous remplacez globalement tout ce qui correspond à l’expression régulière donnée par elle-même ( & ) enveloppée dans les séquences d’échappement ANSI pour la couleur souhaitée (que grep --color fait pour vous). Après avoir traité toutes les correspondances possibles, vous devez explicitement imprimer la ligne.

Si vous voulez quelque chose hors de la boîte, vous cherchez probablement plus haut .

Voici un exemple: Sortie JBoss

Regarde. C’est incroyablement utile pour colorer automatiquement des mots de différentes couleurs. C’est un projet impressionnant qui s’appuie sur ack .

J’avais besoin de mettre en évidence des chaînes de caractères dans des fichiers texte, et je n’ai pas trouvé de méthode adaptée à mes besoins. J’ai donc écrit un programme en C simple pour colorier des chaînes correspondant à des expressions régulières.

Vous pouvez télécharger le code source depuis GitHub:

 git clone http://github.com/mbornet-hl/hl 

puis :

 cd hl/cr; make 

Voici l’utilisation:

 hl: version 1.21 Usage: hl [-h|-eidD][-E][-rgybmcwRGYBMCW] regexp ... -h : help -v : version -u : do not bufferize output on stdout -e : extended regular expressions -i : ignore case -E : print on stderr -r : red -g : green -y : yellow -b : blue -m : magenta -c : cyan -w : white -R : red (reverse video) -G : green (reverse video) -Y : yellow (reverse video) -B : blue (reverse video) -M : magenta (reverse video) -C : cyan (reverse video) -W : white (reverse video) -d : debug -D : display regular expressions 

Pour coloriser le mot “rouge” en rouge et le mot “bleu” en bleu, il suffit de taper la commande suivante:

 echo "red blue red blue" | hl -r red -b blue 

et voici un exemple pour mettre en évidence la sortie de la commande ifconfig:

 hl -ei -m '^(eth|(vir)?br|vnet)[0-9.]*:[0-9]+\>' \ -b '^(eth|(vir)?br|vnet)[0-9.]*\.[0-9]+\>' \ -c '([0-9a-f]{2}:){5}[0-9a-f]{2}' \ -g '\|\|([0-9]{1,3}\.){3}[0-9]{1,3}\>' \ -y '^(eth|(vir)?br|vnet)[0-9.:]*\>' \ -W '[0-9a-f]{4}::[0-9a-f]{4}\:[0-9a-f]{4}:[0-9a-f]{4}:[0-9a-f]{4}' \ -r ' (errors|dropped|overruns):[^0][0-9]*' 

L’ordre dans lequel vous spécifiez les couleurs est important: si une chaîne correspond à plusieurs expressions régulières, la première est prioritaire par rapport à la deuxième, la deuxième est prioritaire par rapport à la troisième et ainsi de suite …

J’espère que cela t’aides.

Essayez le merveilleux http://github.com/rtulke/rpen

nécessite egrep ou grep

cp rpen.py / usr / local / bin / rpen chmod 777 / usr / local / bin / rpen

Alors essaye

ps xau | rpen Ss “S +” “\? \?”

Alors, voici la ou les versions utilisant sed. Disons que vous voulez que le mot “FAILED” soit coloré en rouge, ce serait:

 sed 's/\(ERROR\)/\o033[31m\1\o033[39m/' 

Pour que la ligne entière contenant le mot “FAILED” soit marquée en rouge:

 sed 's/\(.*ERROR.*\)/\o033[31m\1\o033[39m/' 

Pour avoir plusieurs mots marqués en rouge:

 sed 's/\(ERROR\|FAILED\)/\o033[31m\1\o033[39m/' 

Pour que plusieurs mots et leurs lignes soient marqués en rouge:

 sed 's/\(.*FAILED.*\|.*ERROR.*\)/\o033[31m\1\o033[39m/' 

Avoir plusieurs couleurs (ERROR = rouge / FAILED = bleu)

 sed -e 's/\(ERROR\)/\o033[31m\1\o033[39m/' -e 's/\(FAILED\)/\o033[34m\1\o033[39m/' 

Pour utiliser tout cela sur ssh:

 ssh user@host -t "tail -n 1024 -f /some/log/file | sed --unbuffered -e 's/\(.*ERROR.*\|.*FAILED.*\)/\o033[31m\1\o033[39m/' -e 's/\(.*postfix.*\|.*dhcpd.*\)/\o033[32m\1\o033[39m/'" 

Et pour ne pas avoir à taper ceci à chaque fois, déclarez-le simplement comme une fonction dans votre bashrc.

Pour les autres couleurs, recherchez les codes ANSI.

Que dis-tu de ça? Vous pouvez le faire avec grep UNIQUEMENT! Les astuces ici sont (1) vous prenez / OU / des mots que vous recherchez; (2) vous utilisez les options -A et -B avec des nombres suffisamment grands (plus grand que le nombre de lignes de votre fichier).

 echo "you make it" > tmp echo "you take it" >> tmp echo "you cake it" >> tmp echo "you bake it" >> tmp echo "you wake it" >> tmp GREP_COLOR='1;32' grep -P "(take|cake|bake)" --color=always tmp | GREP_COLOR='1;33' grep -P "(cake|bake)" --color=always -A10000 -B10000 | GREP_COLOR='1;34' grep -P "(bake)" --color=always -A10000 -B10000 

cxpgrep convient à cette fin – mettez en évidence les motifs dans différentes couleurs.

 cxpgrep 'PAT1|PAT2|...' FILE_OR_DIRECTORY 

Ma réponse est ci-dessous:

 tailf logfile awk '/MALE/' {print "\033[34m" $0 "\033[39m"} '/MALE/' {print "\033[33m" $0 "\033[39m"}