Préserver la coloration après avoir passé de grep à grep

140

Il y a une question similaire dans Preserve ls coloration après grep'ing mais cela m'ennuie que si vous redirigez la sortie de grep colorée dans un autre grep, la coloration ne soit pas conservée.

A titre d'exemple grep --color WORD * | grep -v AVOIDne conserve pas la couleur de la première sortie. Mais pour moi ls | grep FILEgardez la couleur, pourquoi la différence?

Zitrax
la source
2
Cette question semble hors sujet car elle concerne l'utilisation des commandes Unix, appartient à unix.stackexchange.com
Raptor

Réponses:

162

grepdésactive parfois la sortie couleur, par exemple lors de l'écriture dans un tube. Vous pouvez remplacer ce comportement avecgrep --color=always

La ligne de commande correcte serait

grep --color=always WORD * | grep -v AVOID

C'est assez verbeux, sinon vous pouvez simplement ajouter la ligne

alias cgrep="grep --color=always"

à votre .bashrcpar exemple et utilisez cgrepcomme grep coloré. Lors de la redéfinition, grepvous pourriez rencontrer des problèmes avec les scripts qui reposent sur une sortie spécifique grepet n'aiment pas le code d'échappement ascii.

Otto Allmendinger
la source
4
Cette solution ne fonctionne que dans certaines circonstances chanceuses. Voir la réponse d'Andersonvom ci-dessous.
studog
Dans mon cas (Ubuntu), j'avais déjà un alias grep. alias grep='grep --color=autodonc je dois simplement modifier mon ~/.bashrcendroit où il a été défini en premier lieu.
sobi3ch
Ne fonctionne pas pour moi - similaire à ce scénario stackoverflow.com/a/7640077/248616
Nam G VU
Cette belle idée créative est simple et fonctionnelle. Stackoverflow.com/a/36288791/248616
Nam G VU
la question est de savoir comment faire en sorte que le second grep ne supprime pas la couleur du premier. Ce n’est pas une réponse à cela.
johannes_lalala
74

Un mot de conseil:

Lors de l'utilisation grep --color=always, les chaînes réelles transmises au tube suivant seront modifiées. Cela peut conduire à la situation suivante:

$ grep --color=always -e '1' * | grep -ve '12'
11
12
13

Même si l'option -ve '12'doit exclure la ligne médiane, ce n'est pas le cas car il y a des caractères de couleur entre 1et 2.

andersonvom
la source
Si vous utilisez --color=auto, cela devrait prendre en compte le fait que vous l'avez diffusé ailleurs et supprimer complètement les couleurs, mais cela va à l'encontre de l'objectif. Si vous voulez toujours des résultats colorés, je suppose que vous pouvez le grep à nouveau au dernier tube utilisant --color.
andersonvom
2
Sur Mac OS X, au moins, la coloration du dernier tube comme le suggère @andersonvom ne fonctionne pas. Pas certain de pourquoi; c'est peut-être la coloration du motif exclu? --color=alwaysfonctionne, avec, je suppose, les mises en garde énoncées ci-dessus.
user766353
3
Vous devez avoir le même motif grep deux fois dans votre expression. Je viens de tester cela sur un mac: http://i.imgur.com/BhmwAlF.png
andersonvom
9

Répétez simplement la même commande grep à la fin de votre pipe.
grep WORD * | grep -v AVOID | grep -v AVOID2 | grep WORD

Alex
la source
2
L'inversion des commandes ne fournirait-elle pas le même résultat? grep -v AVOID * | grep WORD
Brydon Gibson
@BrydonGibson probablement, mais c'était un exemple pour montrer que cela fonctionne pour n'importe quel nombre de commandes piped
Alex