Obteniendo resultados coloreados cuando se usa una tubería de grep a menos


246

Uso mucho la opción --colour de grep, pero a menudo también uso menos. ¿Cómo puedo canalizar los resultados de grep a menos y aún preservar el color? (¿O es eso posible?)

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

EDITAR :

Estoy buscando una solución directa o algo equivalente a esto.



¿Qué *hacer? De la página man de grep: ¡ *: The preceding item will be matched zero or more times.Pero todavía no entiendo ..! @JeremyPowell
Shayan

Respuestas:


274

Cuando simplemente ejecuta grep --color, implica grep --color=autoque detecta si la salida es un terminal y, si es así, habilita los colores. Sin embargo, cuando detecta una tubería, deshabilita la coloración. El siguiente comando:

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

Siempre habilitará el color y anulará la detección automática, y obtendrá el resaltado de color less.

EDITAR: Aunque usar solo lessfunciona para mí, tal vez la versión anterior requiera que la -Rbandera maneje los colores, como se sugiere a continuación.


143
Debe usar less -Rpara que la codificación de color se interprete de manera menos correcta
partir de ahí

1
Funcionó para mí solo less, puede depender de la versión.
drrlvn 05 de

1
Un anexo (con suerte) útil: necesitaba excluir algunas coincidencias pero mantener el color, así que en realidad terminé con lo grep pattern file | grep -v badpattern | grep --colour=always pattern | less -Rque satisfizo mis necesidades perfectamente. (¡Gracias de nuevo!)
Owen Blacker

77
No puedo creer que hayan implementado la función de manejo del color lessy, por lo tanto, perdieron la oportunidad de tener una colorlessherramienta especial . ¡Solo por el nombre debería haberse hecho! Probablemente debería escribir un parche que invoca -R automáticamente cuando el binario se ejecuta como colorless.
Christian

2
@OwenBlacker Puede que no sea un alias. Es posible que haya $LESSestablecido con -R.
greyfade

27

Puedes poner esto en tu .bashrcarchivo:

export GREP_OPTIONS="--color=always"

o crea un alias como este:

alias grepc="grep --color=always"

y tendrá que usar la -Ropción para less, como se indica a continuación


29
¡Advertencia !: GREP_OPTIONS = "- color = always" puede romper muchos scripts que usan grep (o (e | f) grep).
mctylr

44
Sí, mejor solo alias grep. Siempre se puede obtener puro grepcon GREPo anular la --coloropción manualmente.
asmeurer

Esto no funciona para mí, aunque el alias sí funciona.
saeedgnu

9

En este caso, prefiero crear archivos sh pequeños y ponerlos /usr/local/bin.
Usualmente uso grepde forma recursiva en el pwd, así que ese es mi script personal:

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

Y luego lo he copiado como /usr/local/bin/g(sí, lo uso mucho)


2
¿Por qué no solo usar funciones de shell para este tipo de cosas? g() { grep --color=always -r "$@" . | less -R }funciona de manera idéntica y probablemente dará (minuciosamente) un mejor rendimiento.
00dani

1
@ 00dani sí, esa también es una alternativa válida y, a veces, la uso. Tenga en cuenta que en este caso, la mayor parte del tiempo se gasta en IO y, por lo tanto, no hay un aumento de rendimiento perceptible :) Otra diferencia es que una vez en su RUTA, este script también se puede usar con otros scripts y alias de shell; la función debe cargarse explícitamente
Iazel

1

No alias "grep", mejor alias "less" que nunca es usado por los shells. En su .bashrcsólo hay que poner: alias less="less -r".


3
No del todo bien. Uno necesita usar ambos grep --color=always y less -R. Tenga en cuenta que grep solo sabe que se está canalizando en algún otro proceso y la --color=autoopción utiliza únicamente esta información para decidir si generará colores o no.
brandizzi

3
Tenga en cuenta que la lessopción -res diferente de -R. Probablemente -Res más seguro.
Craig McQueen

1
Entonces, ¿por qué rechazar mi solución? El OP solicita específicamente lesscon el ejemplo que ya usa la opción `--color '.
not2qubit

3
Un alias es probablemente indeseable aquí. lessadmite una $LESSvariable de entorno. Entonces, en lugar de un alias, export LESS='-R'podría ser preferible.
greyfade

0

Necesito correr

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

con la bandera -r después de menos , para que esto se ejecute.


¿Qué *hacer? De la página man de grep: ¡ *: The preceding item will be matched zero or more times.Pero todavía no entiendo ..!
Shayan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.