Ottenere risultati colorati quando si utilizza un tubo da grep a less


223

Uso molto l'opzione -colour di grep, ma spesso uso anche meno. Come posso ridurre i risultati di grep a meno e preservare la colorazione. (O è possibile?)

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

MODIFICARE :

Sto cercando una soluzione diretta o qualcosa di equivalente a questo.


Risposte:


250

Quando corri semplicemente grep --color implica grep --color=auto che rileva se l'uscita è un terminale e in tal caso abilita i colori. Tuttavia, quando rileva un tubo disabilita la colorazione. Il seguente comando:

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

Attiva sempre la colorazione e sostituisce il rilevamento automatico e otterrai l'evidenziazione del colore less.

MODIFICARE: Anche se usando solo less funziona per me, forse la versione più vecchia richiede il -R bandiera per gestire i colori, come da lì suggerito.


125
Devi usare less -R per la codifica del colore da interpretare in modo meno corretto
therefromhere

1
Ha funzionato per me con solo less, può essere dipendente dalla versione.
drrlvn

1
Un (auspicabilmente) utile addendum: avevo bisogno di escludere alcune partite ma mantenere la colorazione, quindi ho finito con grep pattern file | grep -v badpattern | grep --colour=always pattern | less -R, che ha soddisfatto perfettamente le mie esigenze. (Grazie ancora!)
Owen Blacker

7
Non posso credere che abbiano appena implementato la funzionalità di gestione del colore in less e quindi ha perso la possibilità di avere uno speciale colorless strumento. Solo per il nome avrebbe dovuto essere fatto! Probabilmente dovrei scrivere una patch che invoca -R automaticamente quando il binario viene eseguito come colorless.
Christian

1
@OwenBlacker Potrebbe non essere un alias. Potresti avere $LESS impostato con -R.
greyfade

27

Puoi metterlo nel tuo .bashrc file:

export GREP_OPTIONS="--color=always"

o creare un alias come questo:

alias grepc="grep --color=always"

e dovrai usare il -R opzione per less, come sottolineato da lì


26
Attenzione !: GREP_OPTIONS = "- color = always" potrebbe interrompersi molti script che usano grep (o (e | f) grep).
mctylr

4
Sì, meglio solo alias di grep. Puoi sempre diventare puro grep con GREPo sovrascrivere il --color opzione manualmente.
asmeurer

Questo non funziona per me, alias però funziona.
saeedgnu

5

In questo caso, preferisco creare piccoli file sh e metterli su /usr/local/bin.
Di solito uso grep nel modo ricorsivo sul pwd, questo è il mio copione personale:

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

E poi l'ho appena copiato come /usr/local/bin/g (sì, lo uso molto)


1
Perché non usare le funzioni di shell solo per questo genere di cose? g() { grep --color=always -r "$@" . | less -R } funziona in modo identico e probabilmente darà (minutamente) prestazioni migliori.
00dani

@ 00dani sì, anche questa è un'alternativa valida ea volte la uso. Si noti che in questo caso, la maggior parte del tempo viene speso in IO e quindi non vi è alcun aumento delle prestazioni percepibile :) Un'altra differenza è che una volta nel PATH, questo script può essere utilizzato anche con altri script di shell e alias; la funzione invece deve essere caricata esplicitamente
Iazel

1

Non alias "grep", meglio l'alias "less" che non è mai usato dalle shell. Nel tuo .bashrc appena messo: alias less="less -r".


3
Non proprio giusto. Uno deve usare tutti e due grep --color=always e less -R. Si noti che grep sa solo che è stato convogliato in qualche altro processo e il --color=auto l'opzione utilizza esclusivamente queste informazioni per decidere se emettere i colori o meno.
brandizzi

3
Nota che less opzione -r è diverso da -R. Probabilmente -R è più sicuro
Craig McQueen

1
Quindi, perché down-votare la mia soluzione. L'OP chiede specificamente less con l'esempio già usando l'opzione `--color '.
not2qubit

3
Un alias è probabilmente indesiderabile qui. less supporta a $LESS variabile d'ambiente. Quindi, invece di un alias, export LESS='-R' potrebbe essere preferibile.
greyfade

0

Ho bisogno di correre

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

con il -r bandiera dopo Di meno , per farlo funzionare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.