Guardar salida de un grep en un archivo con colores

36

Necesito guardar el resultado de un comando grep en un archivo, pero también quiero que el archivo de salida se formatee y mantenga los colores como en el terminal.

¿Hay una manera de hacerlo? ¿Tal vez hacer que grep se guarde en algún tipo de lenguaje de marcado? Si no es posible, ¿hay otra herramienta que pueda realizar esta tarea?

Estoy tratando de hacer que la palabra clave de búsqueda se destaque en el archivo de salida, exactamente como lo hace en el terminal.

Moha el todopoderoso camello
fuente

Respuestas:

43

Para mantener el marcado, necesita más que solo un archivo de texto. Usaría la salida HTML para mantener los colores.

  • Instale aha, es decir, "convierte secuencias de escape ANSI de un terminal unix a código HTML "

    sudo apt-get install aha
  • luego guarde su grep(o ls) salida de esta manera:

    ls --color=always | aha --black --title 'ls-with-colors' > ls-with-colors.html

    opciones:

    --black param to set background as black color
    --title param to set the title for HTML page

Sintaxis resaltada para la extensión de archivo vía pygmentize

  • instalar pygmentize:

    sudo apt-get install python-pygments
  • luego ejecuta este tipo de comando:

    pygmentize file.pl | grep -i --color=always version | aha --black > ls-with-colors.html

ingrese la descripción de la imagen aquí

Sylvain Pineau
fuente
1
AHA !! , aha es una herramienta realmente maravillosa, exactamente lo que estaba buscando, ¡Gracias!
Moha el todopoderoso camello
2
@ Mhd.Tahawi: He actualizado mi respuesta para que pueda mantener los colores del código (perl en su caso), pero pygmentizefunciona con muchos otros.
Sylvain Pineau
10

Según lo que desee hacer con el archivo de salida, es posible agregar colores a un archivo de texto normal porque los colores simplemente provienen de algunos caracteres especiales. Parece que Grep no quiere imprimirlos cuando lo redirige a un archivo, por lo que debe forzarlo a:

grep --color=always "stuff" input.txt > output.txt

Ahora, cuando imprima el archivo en la consola, se imprimirá con los colores, porque Bash interpreta esos caracteres como "use este color".

cat output.txt

Sin embargo, si lo abres en un editor como vim, obtendrás algunos personajes extraños. Por ejemplo, cuando uso los comandos

echo "A sentence. A red sentence. Another sentence." \
  | grep --color=always "A red sentence" > output.txt

El resultado se ve bien cuando lo imprimo usando catpero cuando lo abro vimme sale

A sentence. ^[[01;31m^[[KA red sentence^[[m^[[K. Another sentence.

Entonces, si desea utilizar un editor, probablemente esto no sea lo que desea.

MasterOfBinary
fuente
¡Correcto!, Estaba obteniendo esos extraños símbolos en el medio y no entendía cuáles son esos.
Moha el todopoderoso camello
realmente me gusta lo simple / efectiva que es tu respuesta. solo cat la salida :). Esto es genial a corto plazo (lo suficientemente bueno para mí en este momento).
Trevor Boyd Smith
Detalle: es el terminal (emulador), no bash, el que interpreta las secuencias de escape de color (también conocidos como caracteres extraños).
masterxilo
2

Si entendí correctamente, desea guardar una salida de terminal en un archivo de texto, ¿verdad? Pero quieres que esté formateado con colores. Si ese es el caso, aquí están mis ideas:

Destacando la salida automáticamente

Como probablemente sepa, si captura una salida grep en un archivo de texto, exactamente porque es un archivo de texto, no puede formatearse. Entonces, que yo sepa, no puedes hacerlo de una manera fácil.

A pesar de eso, existe una solución simple, que consiste en hacer saber a su editor de texto qué tipo de archivo está abriendo. Por ejemplo, supongamos que su salida grep tiene algunos componentes bash, por lo que los reflejos bash funcionan para usted (por cierto, estos son a menudo los colores que ve en una salida coloreada en el terminal). Entonces, el truco es guardar la salida de texto en un archivo con la extensión adecuada. En lugar de hacer algo como:

ls | grep something > output

puedes ir por

ls | grep something > output.sh

Lo que hará que gedit (o cualquier editor de texto decente) reconozca automáticamente que está hablando de código bash, y lo resaltará en consecuencia. No necesita colorear el resultado, el programa lo hará por usted si reconoce el tipo de código que está abriendo. Si está trabajando con otro tipo de formatos, simplemente adapte la extensión a ese ajuste mejor para lo que está buscando (por ejemplo,> output.xml,> output.html,> output.py ... etc.). ¡Buena suerte! :)

Destacando algunas palabras en el archivo de salida

Entonces, si lo tengo, desea resaltar las palabras que buscó. Nuevamente, eso no se puede hacer en un archivo de texto sin formato solo porque es un texto sin formato. Sin embargo, puede agregarle algún formato de una manera muy fácil, como usar algo de codificación html. Esto transformará su salida en un código html, y cuando lo abra con un programa capaz de interpretar html (libreoffice writer, firefox y 10000 etceteras) verá algunas palabras resaltadas.

Para hacerlo, digamos que este es su grep, exportado a html:

ls | grep keytext > output.html

Y ahora desea resaltar el texto clave en su salida. Puedes usar sed para hacerlo, como:

sed -i 's/keytext/<font color="red">keytext<\/font>/g' output.html

Y violà, ahora su texto clave está resaltado en rojo.

Rho
fuente
1
buena idea !!, pero no estoy buscando resaltado de sintaxis. usted sabe cómo grep colorea la palabra clave de búsqueda con otro color, generalmente rojo. Quiero mantener eso para que la palabra clave destaque en el archivo de salida.
Moha el todopoderoso camello
ok, entonces, ¿estás buscando algo con color? como un código html? Si ve color en la entrada, entonces debe formatearse y, por lo tanto, codificarse en alguna parte, como "fontcolor: red", ¿verdad? Si este es el caso, es posible que deba incluir el código de formateo en su grep. :)
Rho
ok, con la edición en la pregunta lo entiendo. :) ¿Qué extensión de salida estás usando?
Rho
Estoy usando un código perl, cuando utilicé la extensión perl, obtuve una coloración de sintaxis completa, y estoy usando un nombre de variable para que ni siquiera tuviera color.
Moha el todopoderoso camello