grep: comment colorer 2 mots clés?

12

Je sais comment grep 2 mots-clés en utilisant 1 commande, mais je ne peux que colorer l'un d'eux en sortie. Voici ma commande:

grep 'keyword1' file.log | grep 'keyword2'

Seul keyword2est mis en surbrillance. Comment puis-je mettre en keyword1évidence en même temps?

Raptor
la source

Réponses:

15

La grepcommande accepte une --color=alwaysoption, vous pouvez donc utiliser

grep 'keyword1' file.log --color=always | grep 'keyword2'

Comme le souligne gertvdijk , cette commande peut être inefficace, mais elle recherchera toutes les lignes qui contiennent à la fois mot-clé1 et mot-clé2. Si vous souhaitez les surligner de différentes couleurs, vous pouvez utiliser

grep 'keyword1' file.log --color=always | GREP_COLORS="mt=01;34" grep --color=always 'keyword2'

qui mettra en évidence le mot-clé2 en bleu. La mtpartie signifie que grepmettra en évidence le texte correspondant en utilisant ce code CSI , et 01;34signifie "un premier plan bleu gras sur un fond normal".

Daniel H
la source
1
+1 pour des explications détaillées et des options de personnalisation pour le cas d'utilisation!
gertvdijk
C'est drôle, quand j'essaye avec: grep -R --color = always keyword1. | grep keyword2 // seul le premier mot clé est mis en surbrillance. Comment pourrais-je adapter votre réponse pour travailler avec la recherche récursive?
TenLeftFingers
1
C'est étrange, ça grep -R --color=always keyword1 . | grep keyword2devrait marcher. Vous allez être redirigé la sortie à nouveau (comme en canalisant le second grepen less -R)? Si c'est le cas, vous devrez également ajouter --color=alwaysau second.
Daniel H
Très bonne réponse! Pour mettre en évidence les deux, un --color=autoserait nécessaire pour le second grep, juste après 'keyword2'.
Luis
@Luis Ouais, vous avez raison, Grep au moins souvent par défaut est sans couleur (bien que cela puisse être une option de configuration? Je ne pense pas que j'aie eu cette priorité en 2013 quand cela fonctionnait sur ma machine sans ça…). J'ai ajouté --color=alwaysà la réponse, parce que vous voudrez peut-être la diriger lessou quelque chose aussi.
Daniel H
3

Essayez des expressions régulières réelles, plutôt que de diriger vers une autre instance de grep, par exemple:

grep -E "\<foo\>.*\<bar\>" file

Cela se limite malheureusement aux lignes correspondantes dans lesquelles les mots-clés correspondent dans cet ordre. Quoi qu'il en soit, l'utilisation de grepdans votre question est plutôt inefficace et vous devez l'éviter. La réponse de @DanielH est probablement beaucoup plus simple pour votre cas, probablement.

Pour une correspondance «ou» de mots clés, j'utilise ceci régulièrement:

grep -E "(foo|bar)" file
gertvdijk
la source
1
Je pense que l'OP ne veut que des lignes qui contiennent les deux mots-clés (la commande que vous avez donnée donne toutes les lignes qui contiennent l'un ou l'autre).
Daniel H
@DanielH Merci de l'avoir signalé. J'ai mis à jour ma réponse.
gertvdijk
Cela ne fonctionne-t-il toujours que si foo vient avant la barre? Je ne sais pas s'il existe un meilleur moyen que foo.*bar|bar.*foo, ou si cela est même nécessaire pour ce cas (qui semble être un fichier journal qui aurait probablement un ordre standard pour les mots clés). J'ai ajouté ma réponse avant de mettre à jour la vôtre, mais je la garderai au cas où il y aurait une situation où les chaînes grepsont vraiment nécessaires (ou toute autre sortie colorée ne devrait pas être envoyée au terminal, par exemple grep | less -R).
Daniel H