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
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".
+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:
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).
grep -R --color=always keyword1 . | grep keyword2
devrait marcher. Vous allez être redirigé la sortie à nouveau (comme en canalisant le secondgrep
enless -R
)? Si c'est le cas, vous devrez également ajouter--color=always
au second.--color=auto
serait nécessaire pour le secondgrep
, juste après'keyword2'
.--color=always
à la réponse, parce que vous voudrez peut-être la dirigerless
ou quelque chose aussi.Essayez des expressions régulières réelles, plutôt que de diriger vers une autre instance de
grep
, par exemple: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
grep
dans 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:
la source
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înesgrep
sont vraiment nécessaires (ou toute autre sortie colorée ne devrait pas être envoyée au terminal, par exemplegrep | less -R
).