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.