Conserva la coloración después de conectar grep a grep


140

Hay una pregunta similar en Preserve ls coloring después de grep'ing, pero me molesta que si canaliza la salida de color grep a otro grep, el color no se conserva.

Como ejemplo grep --color WORD * | grep -v AVOIDno mantiene el color de la primera salida. Pero para mí ls | grep FILEmantener el color, ¿por qué la diferencia?


2
Esta pregunta parece estar fuera de tema porque se trata del uso del comando Unix, pertenece a unix.stackexchange.com
Raptor

Respuestas:


162

grepa veces deshabilita la salida de color, por ejemplo, al escribir en una tubería. Puede anular este comportamiento congrep --color=always

La línea de comando correcta sería

grep --color=always WORD * | grep -v AVOID

Esto es bastante detallado, alternativamente, solo puede agregar la línea

alias cgrep="grep --color=always"

a su .bashrcpor ejemplo y usar cgrepcomo grep de color. Al redefinir grep, puede tener problemas con los scripts que dependen de resultados específicos grepy no les gusta el código de escape ASCII.


44
Esta solución solo funciona bajo ciertas circunstancias afortunadas. Ver la respuesta de andersonvom a continuación.
studog

En mi caso (Ubuntu) ya tenía un alias grep. alias grep='grep --color=autoasí que necesito simplemente alterar mi ~/.bashrcdonde se definió en primer lugar.
sobi3ch

No funciona para mí, similar a este escenario stackoverflow.com/a/7640077/248616
Nam G VU

Esta agradable idea creativa es simple y funciona stackoverflow.com/a/36288791/248616
Nam G VU

La pregunta es cómo hacer que el segundo grep no suprima el color del primero. Esta no es una respuesta a eso.
johannes_lalala

74

Un consejo:

Cuando se usa grep --color=always, las cadenas reales que se pasan a la siguiente tubería se cambiarán. Esto puede conducir a la siguiente situación:

$ grep --color=always -e '1' * | grep -ve '12'
11
12
13

Aunque la opción -ve '12'debe excluir la línea media, no lo hará porque hay caracteres de color entre 1y 2.


Si lo usa --color=auto, debería detectar el hecho de que lo está canalizando en otro lugar y suprimir los colores por completo, pero de alguna manera frustra el propósito. Si aún desea resultados coloreados, supongo que podría volver a usarlo en la última tubería que use --color.
andersonvom

2
En Mac OS X, al menos, colorear en la última tubería como sugiere @andersonvom no funciona. No estoy seguro de por qué; tal vez está coloreando el patrón excluido? --color=alwaysfunciona, con, supongo, las advertencias mencionadas anteriormente.
user766353

3
Tienes que tener el mismo patrón grep dos veces en tu expresión. Acabo de probar esto en una Mac: http://i.imgur.com/BhmwAlF.png
andersonvom

9

Simplemente repita el mismo comando grep al final de su tubería.
grep WORD * | grep -v AVOID | grep -v AVOID2 | grep WORD


2
¿No invertir los comandos proporcionaría el mismo resultado? grep -v AVOID * | grep WORD
Brydon Gibson

@BrydonGibson probablemente, pero fue un ejemplo para mostrar que funciona para cualquier cantidad de comandos canalizados
Alex
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.