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.



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.


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à


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)


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".


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.