76 votes

Afficher tous les résultats mais mettre en évidence les résultats de la recherche

En bash, si je veux exécuter une commande et n'afficher que les lignes de sortie qui correspondent à un certain modèle, je peux l'envoyer dans le tube suivant grep comme

fichier testfile

hello
there
my
friends

commande

$ cat testfile | grep 'hello'
hello #this will be highlightd

cela mettra en évidence la correspondance recherchée et affichera la ligne entière sur laquelle elle se trouve. Je peux utiliser -A y -B pour afficher les lignes avant et après cette ligne. Ma question est la suivante : est-il possible d'exécuter la commande et d'afficher tous les résultats comme d'habitude, mais de mettre en évidence les résultats de la recherche comme le ferait grep ? ainsi, mon résultat serait le suivant

hello #highlighted
there
my
friends

74voto

bot779 Points 751

Pour utiliser un GREP couleur afin de ne mettre en évidence que les motifs correspondants, sans modifier le résultat :

grep --color=always -e "^" -e "hello" testfile

Le premier motif correspondra à toutes les lignes (toutes les lignes seront imprimées) ; le second motif (et tous les motifs suivants) fera apparaître le texte correspondant en couleur.

Étant donné que le premier motif correspond à toutes les lignes mais ne correspond pas à un caractère imprimable, il n'ajoute pas de surlignage de couleur afin de ne pas concurrencer/interférer avec la lisibilité du texte surligné.

34voto

Rachel Blackman Points 81

Ajouter une option -z à votre commande GNU grep :

cat testfile | grep --color=always -z 'hello'

ou plus court

grep --color=always -z 'hello' testfile

9voto

Marián Černý Points 296

Celui-ci fonctionne avec GNU grep ainsi qu'avec grep sous FreeBSD :

grep --color=always 'hello\|$'

Il correspond au texte "hello" ou ( \| ) la chaîne nulle non imprimable à la fin de chaque ligne ( $ ). C'est pourquoi chaque ligne est imprimée mais seul "hello" est mis en évidence.

Il y a de fortes chances que vous ayez déjà --color=auto configuré dans votre Shell. Alors vous n'avez probablement pas besoin de spécifier --color=always :

grep 'hello\|$'

Vous pouvez également simplifier la version en utilisant egrep (avec des expressions régulières étendues), où | pour l'expression "ou" n'a pas besoin d'être échappée :

egrep 'hello|$'

8voto

Noam Manos Points 1506

Comme pour la réponse précédente, vous pouvez attraper tous les $ fin des lignes :

cat testfile | grep --color -E "hello|$"

-E (o --extended-regexp ) signifie que les caractères spéciaux doivent être échappés à l'aide de la fonction \ . Lorsque vous l'utilisez, | sera traitée comme une condition regex "OR".

Grep |$ attrapera et imprimera également toutes les lignes qui ont une fin, mais comme $ est un caractère caché, il ne peut pas être mis en évidence.

Mise à jour :

Si vous souhaitez affiche tous les résultats, mais renvoie également le code de sortie pour savoir si la correspondance a été trouvée ou non, vous pouvez utiliser la commande perl :

cat testfile | \
perl -pe 'BEGIN {$status=1} END {exit $status} $status=0 if /hello/;'

Si vous préférez sed - Voici un exemple de comment mettre en évidence toutes les correspondances + retourner le code de sortie si aucune correspondance n'est trouvée : https://askubuntu.com/a/1200851/670392

1voto

rpmohn Points 11

Complément à la réponse ci-dessus. La fonction highlight{} mentionnée dans les commentaires ne fonctionne que lorsque des données y sont injectées. L'alias suivant, bien qu'imparfait, est plus utile :

alias greph="grep --color=always -e^ -e"

Cela fonctionne avec des commandes telles que :

greph foo bar.txt

cat bar.txt | greph foo

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X