Obtenir des résultats colorés lors de l'utilisation d'un tuyau de grep à moins

246

J'utilise beaucoup l'option --colour de grep, mais j'utilise aussi souvent moins. Comment puis-je diriger les résultats de grep vers moins tout en préservant la coloration? (Ou est-ce possible?)

grep "search-string" -R * --colour | less 

EDIT :

Je cherche une solution directe ou quelque chose d'équivalent à ceci.

Jeremy Powell
la source
Reproduction
Que fait *-il? De la page de manuel de grep: *: The preceding item will be matched zero or more times.Mais je ne comprends toujours pas ..! @ JeremyPowell
Shayan

Réponses:

274

Lorsque vous l'exécutez simplement, grep --colorcela implique de grep --color=autosavoir si la sortie est un terminal et, le cas échéant, d'activer les couleurs. Cependant, lorsqu'il détecte un tuyau, il désactive la coloration. La commande suivante:

grep --color=always -R "search string" * | less

Permettra toujours coloration et passer outre la détection automatique, et vous obtiendrez la couleur de surbrillance dans less.

EDIT: Bien que l’utilisation ne lessfonctionne que pour moi, une version plus ancienne nécessite peut-être le -Rdrapeau pour gérer les couleurs, comme suggéré ici.

drrlvn
la source
143
Vous devez utiliser less -Rpour le codage des couleurs pour être interprété par moins correctement
therefromhere
1
Cela a fonctionné pour moi avec juste less, cela peut dépendre de la version.
drrlvn
1
Un additif (espérons-le) utile: je devais exclure certaines allumettes mais conserver la coloration, donc je me suis retrouvé avec grep pattern file | grep -v badpattern | grep --colour=always pattern | less -R, ce qui a parfaitement répondu à mes besoins. (Merci encore!)
Owen Blacker
7
Je ne peux pas croire qu'ils viennent juste d'implémenter la fonctionnalité de gestion des couleurs lesset ont donc manqué l'occasion d'avoir un colorlessoutil spécial . Pour le seul nom, cela aurait dû être fait! Je devrais probablement écrire un patch qui appelle -R automatiquement lorsque le binaire est exécuté en tant que colorless.
Christian
2
@ OwenBlacker Ce n'est peut-être pas un alias. Vous pourriez avoir $LESSréglé avec -R.
Greyfade
27

Vous pouvez mettre ceci dans votre .bashrcdossier:

export GREP_OPTIONS="--color=always"

ou créez un alias comme ceci:

alias grepc="grep --color=always"

et vous aurez besoin d'utiliser l' -Roption pour less, comme indiqué par là

Dennis Williamson
la source
29
Avertissement !: GREP_OPTIONS = "- color = always" peut interrompre de nombreux scripts utilisant grep (ou (e | f) grep).
mctylr
4
Ouais, mieux vaut juste alias grep. Vous pouvez toujours vous purifier grepavec GREPou remplacer l’ --coloroption manuellement.
asmeurer
Cela ne fonctionne pas pour moi, mais alias fonctionne.
saeedgnu
9

Dans ce cas, je préfère créer et mettre en place de petits fichiers sh /usr/local/bin.
J'utilise habituellement grepde manière récursive sur la pwd, c'est donc mon script personnel:

#!/bin/sh
grep --color=always -r "$@" . | less -R

Et puis je viens de le copier comme /usr/local/bin/g(oui, je l’utilise beaucoup)

Iazel
la source
2
Pourquoi ne pas simplement utiliser les fonctions du shell pour ce genre de chose? g() { grep --color=always -r "$@" . | less -R }fonctionne de manière identique et donnera probablement (minutieusement) de meilleures performances.
00 Jani
1
@ 00dani ouais, c'est une alternative valable aussi et parfois je l'utilise. Notez que dans ce cas, la plupart du temps est consacré aux E / S et qu’il n’ya donc aucune amélioration perceptible des performances :) Une autre différence est qu’une fois dans votre PATH, ce script peut également être utilisé avec d’autres scripts de shell et alias; la fonction doit plutôt être explicitement chargée
Iazel
1

Ne pas alias "grep", mais alias "moins" qui n’est jamais utilisé par les shells. Dans votre .bashrcvient de mettre: alias less="less -r".

not2qubit
la source
3
Pas tout à fait juste. Il faut utiliser les deux grep --color=always et less -R. Notez que grep sait seulement qu'il est transféré dans un autre processus et l' --color=autooption utilise uniquement cette information pour décider si les couleurs seront affichées ou non.
brandizzi
3
Notez que cette lessoption -rest différente de -R. C'est probablement -Rplus sûr.
Craig McQueen
1
Alors pourquoi voter à la baisse ma solution? L'OP demande spécifiquement lessavec l'exemple en utilisant déjà l'option `--color '.
not2qubit
3
Un alias est probablement indésirable ici. lessprend en charge une $LESSvariable d'environnement. Donc, au lieu d'un alias, export LESS='-R'pourrait être préférable.
Greyfade
0

J'ai besoin de courir

grep --color=always -R "search string" * | less - r

avec le drapeau -r après less , pour que cela fonctionne.

Pierre François
la source
Que fait *-il? De la page de manuel de grep: *: The preceding item will be matched zero or more times.Mais je ne comprends toujours pas ..!
Shayan