grep: affiche toutes les sorties mais met en évidence les correspondances de recherche

39

en bash, si je veux exécuter une commande et afficher uniquement les lignes de sortie qui correspondent à un certain modèle, je peux le diriger vers grep, comme

fichier test de fichier

hello
there
my
friends

commander

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

cela mettra en évidence la correspondance de recherche et affichera toute la ligne sur laquelle elle se trouve. Je peux utiliser -Aet -Bpour 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 toutes les sorties normalement, mais de mettre en évidence les correspondances de recherche comme le ferait grep? donc ma sortie serait

hello #highlighted
there
my
friends
ewok
la source

Réponses:

38

Pour utiliser un GREP couleur pour ne mettre en surbrillance que les motifs correspondants mais pas autrement changer la sortie:

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) feront surligner en couleur le texte correspondant.

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

bot779
la source
Fonctionne avec kubectl kubectl apply -k . | grep --color=always -e "^" -e "configured"dans zsh
Michael Cole
Pour une utilisation dans Bash: highlight () {grep --color = always -e "^" -e $ *; }
Jon
Cela fonctionne aussi sur FreeBSD, vous avez juste besoin d'échanger le premier et le second patern ( "^"doit être le second).
Marián Černý
25

Ajoutez une option -zà votre commande GNU grep:

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

ou plus court

grep --color=always -z 'hello' testfile
Cyrus
la source
3
Ceci est un hack très grossier. Cela a pour effet de traiter l'intégralité du fichier comme une seule ligne. Par conséquent, (1) si le fichier est très grand, il peut y avoir une possibilité de manquer de mémoire, et (2) si le fichier ne contient pas le motif du tout , alors rien ne sera émis.
G-Man dit `` Réintègre Monica '' le
Sur quelle version de grep est-ce pris en charge? Sur grep 2.5.4, -z ne semble pas disponible ...
Alex
@Alex: J'ai utilisé GNU grep version 2.6.3.
Cyrus
2
@ G-Man: plus d'économie de ressources:grep --color "hello\|$" file
Cyrus
@Cyrus: Oui, c'est une meilleure réponse. Malheureusement, elle est essentiellement équivalente à la réponse de bot779 à cette question, et presque identique aux réponses acceptées ( 1 et 2 ) aux questions auxquelles j'ai lié.
G-Man dit `` Réintègre Monica '' le
4

De la même manière que pour la réponse précédente, vous pouvez attraper toutes les $extrémités des lignes:

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

-E(ou --extended-regexp) signifie que les caractères spéciaux doivent être échappés avec \. Lors de son utilisation, |sera traité comme une condition regex "OU".

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

Mise à jour:

Si vous souhaitez imprimer toutes les sorties, mais aussi retourner le code de sortie , qu'une correspondance ait é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 pour mettre en surbrillance toutes les correspondances + retourner le code de sortie si aucune correspondance n'a été trouvée: https://askubuntu.com/a/1200851/670392

Noam Manos
la source
2

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

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

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

Vous avez probablement déjà --color=autoconfiguré dans votre shell. Vous n'avez alors probablement pas besoin de spécifier --color=always:

grep 'hello\|$'

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

egrep 'hello|$'
Marián Černý
la source
Cela ne répond pas à l'affichage de toutes les lignes d'entrée.
Chris Page
@ChrisPage Je dirais que c'est le cas: c'est pourquoi chaque ligne est imprimée mais seul "bonjour" est mis en surbrillance.
Marián Černý
0

Ajout à la première réponse ci-dessus. La fonction de surbrillance {} mentionnée dans les commentaires ne fonctionne que lorsque des données y sont acheminées. L'alias suivant, bien qu'il ne soit pas parfait, 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
rpmohn
la source