Comment puis-je conserver les codes couleur avec une entrée grep?

15

Si j'utilise deux grepcommandes consécutives , par exemple:

echo "foo bar" | grep foo | grep bar

Ensuite, le premier motif ("foo") n'est pas mis en surbrillance. En fait, il semble que grep supprime les codes de couleur de son entrée. Est-il un moyen d'empêcher cela?

Chris2048
la source
Une autre question avec la même réponse: comment pouvez-vous restaurer une sortie colorée à un grep dans une fonction bash?
Camille Goudeseune

Réponses:

23

Utilisez --color=always.

grepdétecte si la sortie est vers un tube (ou fichier). Vous ne voulez plus de couleurs lorsque la sortie est dans un fichier - car il s'agit de séquences d'échappement pour le terminal. Typiquement:

foo ^[[01;31m^[[Kbar^[[m^[[K

par exemple:

grep pattern file > result

Pour remplacer l'utilisation --color=always.

grep --color=always pattern file | ...

Exemple:

Ayant fichier:

ID=111;Year=2013;foo=bar
ID=222;Year=2013;foo=baz

alors

grep --color=always ID file | grep --color=always 2013 | grep foo

colorierait ID, 2013et foo.

grep --color=always ID file | grep 2013 | grep foo

colorerait IDet foo, mais pas 2013.

1 Important: Vous devez également vous rappeler que l' encombrement supplémentairedes couleurs est passé à la commande suivante de la chaîne. Une fois que l'ID est colorée, vous ne pouvez pas (facilement) faire correspondre par exempleID=111.


Dans certains cas, on voudra peut-être les couleurs des terminaux dans le fichier . Essayez par exemple

 grep --color=always foo file > result
 cat result

Bien que le fichier résultant aurait une portabilité très limitée.


La coloration elle-même est également une extension.


Comme mentionné par le bon @slm , vous pouvez ajouter:

export GREP_OPTIONS="--color=always"

à votre .bashrcetc, mais pas à moins que vous ne compreniez vraiment les implications et que vous vouliez toujours le faire. Il se romprait à bien des égards en grepraison du fait mentionné ci-dessus 1 .

Ajoutez un aliassi vous l'utilisez souvent.

 alias cgrep='grep --color=always'

GREP_OPTIONSet --color prendre trois options : never, autoet always. Les deux premiers devraient être les seuls envisagés GREP_OPTIONS.

Vous pouvez également consulter GREP_COLORSles manpages ou sur gnu grep .

Runium
la source
Détails supplémentaires sur ces méthodes pour / contre ici: stackoverflow.com/questions/867877/…
slm
1
ajoutez ceci à la réponse aussi: export GREP_OPTIONS="--color=always"dans un .bashrc fait des options les valeurs par défaut pour tous les greps, et vous l'avez à peu près cloué!
slm
Bonnes choses dans ce Q&A Super Uuser: superuser.com/questions/36022/…
slm
"grep détecte si la sortie est vers un tube" - aha! C'est la clé, grep ne colore pas s'il fait partie d'un tuyau. Il devrait y avoir un principe de substitution contre ce genre de chose: - /
Chris2048
@ Chris2048: Ceci est standard pour la plupart des outils d'impression de couleurs sur le terminal. Vous pourriez trouver plus de détails par cela , sur la façon dont il est détecté, et cela montre quelques problèmes, par exemple par ls et les couleurs sur les lscoreutils natifs et gnu OSX .
Runium