¿Cómo puedo mantener los códigos de color con entrada grep?

15

Si uso dos grepcomandos consecutivos , por ejemplo:

echo "foo bar" | grep foo | grep bar

Entonces el primer patrón ("foo") no está resaltado. De hecho, parece que grep elimina los códigos de color de su entrada. hay alguna forma de prevenir esto?

Chris2048
fuente
Otra pregunta con la misma respuesta: ¿cómo puede restaurar la salida de color a un grep dentro de una función bash?
Camille Goudeseune

Respuestas:

23

Uso --color=always.

grepdetecta si la salida es a una tubería (o archivo). La mayoría de las veces nunca quieres colores cuando la salida es para archivar, ya que son secuencias de escape para el terminal. Típicamente:

foo ^[[01;31m^[[Kbar^[[m^[[K

de por ejemplo:

grep pattern file > result

Para anular el uso --color=always.

grep --color=always pattern file | ...

Ejemplo:

Tener archivo:

ID=111;Year=2013;foo=bar
ID=222;Year=2013;foo=baz

Luego

grep --color=always ID file | grep --color=always 2013 | grep foo

colorearía ID, 2013y foo.

grep --color=always ID file | grep 2013 | grep foo

colorearía IDy foo, pero no 2013.

1 Importante: también debe recordar que el desorden agregadode los colores se pasa al siguiente comando de la cadena. Una vez que la identificación está coloreada, no puede (con facilidad), por ejemplo, hacer coincidirID=111.


En alguna ocasión, uno quizás querría colores terminales en el archivo . Intenta, por ejemplo

 grep --color=always foo file > result
 cat result

Aunque el archivo resultante tendría una portabilidad muy limitada.


El color en sí también es una extensión.


Como mencionó el buen @slm , podría agregar:

export GREP_OPTIONS="--color=always"

a su .bashrcetc., pero no lo haga a menos que, por alguna razón, realmente comprenda las implicaciones y aún así quiera hacerlo. Se rompería de muchas maneras grepdebido al hecho mencionado anteriormente 1 .

Agregue un aliassi lo usa con frecuencia.

 alias cgrep='grep --color=always'

GREP_OPTIONSy --color tomar tres opciones : never, autoy always. Los dos primeros deberían ser los únicos considerados GREP_OPTIONS.

También puede consultar GREP_COLORSen las manpáginas o en gnu grep .

Runium
fuente
Detalles adicionales sobre estos métodos pros / contras aquí: stackoverflow.com/questions/867877/…
slm
1
agregue esto a la respuesta también: export GREP_OPTIONS="--color=always"en un .bashrc hace que las opciones sean las predeterminadas para cualquier greps, ¡y prácticamente lo ha logrado!
slm
Eso está muy bien en este Super Uuser Q & A: superuser.com/questions/36022/...
SLM
"grep detecta si la salida es a una tubería" - ¡ajá! Esta es la clave, grep no está coloreando si es parte de una tubería. Debería haber un principio de sustitución contra este tipo de cosas: - /
Chris2048
@ Chris2048: Esto es estándar para la mayoría de las herramientas que imprimen colores en el terminal. Es posible que encuentre más detalles sobre esto , sobre cómo se detecta, y esto muestra algunos problemas, por ejemplo, ls y colores en OSX lsNative y GNU Coreutils.
Runium