Hay un elegante método en bash para ejecutar grep en contra de un archivo de texto con dos o más patrones, y cada patrón que coincida con la salida en un color diferente?

Así una línea que coincide con en MALE y AUGUST sería la salida de MALE en azul y AUGUST en orange?
Estoy abierto para el uso de sed, awk, grep y lápices de colores u otros.

InformationsquelleAutor Evil Genius | 2013-06-21

9 Comentarios

  1. 50

    Puede cascada greps con diferentes colores especificando –color=siempre y el uso de la expresión regular ‘foo|$’ pasar todas las líneas.

    Por ejemplo:

    tail -f myfwlog | GREP_COLOR='01;36' egrep --color=always 'ssh|$' | GREP_COLOR='01;31' egrep -i --color=always 'drop|deny|$'

    Si quieres toda la línea a destacar, la actualización de la expresión regular en consecuencia:

    .... GREP_COLOR='01;31' egrep -i --color=always '^.*drop.*$|^.*deny.*$|$'
    • Esto no funciona si el mismo se definen los valores en GREP_COLORS (nota de la parte final del S) – trate de anular la definición de antes: $ GREP_COLORS= (GREP_COLOR está en desuso)
    • Para la actualización de la totalidad de la línea, la modificación de la expresión regular es el enfoque equivocado. En su lugar, utilice GREP_COLORS='sl=1;31' grep ... y especificar sl a color de toda la línea.
    • cómo restringir el final de las líneas de salida sólo a la línea donde una palabra es correspondido? Actual comando de impresión de toda la línea, pero el color de la palabra cuando se encuentra. Estoy buscando real grep funcionalidad en la salida.
    • GREP_COLORS=’sl=1;31′ pone de relieve TODA la LÍNEA. Uso mt= lugar
  2. 29

    grep es una expresión regular comparador, no es un resaltador de sintaxis :). Tendrás que utilizar varias invocaciones de grep, utilizando un valor diferente de GREP_COLOR para cada uno.

    GREP_COLOR="1;32" grep foo file.txt | GREP_COLOR="1;36" grep bar

    Que destacaría «foo» y «bar» en diferentes colores en las líneas que coincidan con los dos. No creo que hay una (simple) manera de manejar todos instancias de patrón, corta de la fusión de la secuencia de salida de dos llamadas independientes:

    { GREP_COLOR="1;32" grep foo file.txt
      GREP_COLOR="1;36" grep bar file.txt
    } | ...

    que obviamente se ven diferentes que si había una manera de asignar un color distinto a cada expresión regular.


    Puede utilizar awk sustituir cada partido con la misma envuelto en el código de control correcto.

     echo "foo bar" | awk '{ gsub("bar", "3[1;33m&3[0m");
                             gsub("foo", "3[1;36m&3[0m"); print }'

    En cada línea a nivel mundial reemplazar nada que coincida con la expresión regular con la misma (&) envuelto en las secuencias de escape ANSI para el color deseado (que grep --color hace por usted). Después de procesar todos los partidos posibles, deberá explícitamente impresión de la línea.

  3. 15

    Si quieres algo fuera de la caja, usted está probablemente en busca de hhighlighter.

    He aquí un ejemplo:Grep salida con varios Colores?

    Echar un vistazo. Es increíblemente útil para colorear palabras en diferentes colores de forma automática. Es un impresionante proyecto que se construye en la parte superior de ack.

    • h marcador es un pequeño Bash función que automatiza la construcción de un gasoducto de ack comandos y funciona de la misma manera como los otros dos greprespuestas.
  4. 8

    Tuve la necesidad de destacar las cadenas en archivos de texto, y no encontrar una manera que se adapte a mis necesidades, así que escribí un sencillo programa en C para colorear cadenas de coincidencia de expresiones regulares.

    Puede descargar el código fuente de GitHub :

    git clone http://github.com/mbornet-hl/hl

    a continuación :

    cd hl/cr; make

    Aquí es el uso de :

    hl: version 1.21
    Usage: hl [-h|-eidD][-E][-rgybmcwRGYBMCW] regexp ...
      -h : help
      -v : version
      -u : do not bufferize output on stdout
      -e : extended regular expressions
      -i : ignore case
      -E : print on stderr
      -r : red
      -g : green
      -y : yellow
      -b : blue
      -m : magenta
      -c : cyan
      -w : white
      -R : red     (reverse video)
      -G : green   (reverse video)
      -Y : yellow  (reverse video)
      -B : blue    (reverse video)
      -M : magenta (reverse video)
      -C : cyan    (reverse video)
      -W : white   (reverse video)
      -d : debug
      -D : display regular expressions

    Para colorear la palabra «rojo» en rojo, y la palabra «azul» en azul, usted sólo tiene que escribir el siguiente comando :

    echo "red blue red blue" | hl -r red -b blue

    y aquí es un ejemplo a destacar la salida del comando ifconfig :

    hl -ei -m '^(eth|(vir)?br|vnet)[0-9.]*:[0-9]+\>'             \
           -b '^(eth|(vir)?br|vnet)[0-9.]*\.[0-9]+\>'            \
           -c '([0-9a-f]{2}:){5}[0-9a-f]{2}'                     \
           -g '\<UP\>|\<RUNNING\>|([0-9]{1,3}\.){3}[0-9]{1,3}\>' \
           -y '^(eth|(vir)?br|vnet)[0-9.:]*\>'                   \
           -W '[0-9a-f]{4}::[0-9a-f]{4}\:[0-9a-f]{4}:[0-9a-f]{4}:[0-9a-f]{4}' \
           -r ' (errors|dropped|overruns):[^0][0-9]*'

    El orden en el que se especifican los colores es importante : si una cadena coincide con varias de las expresiones regulares, la 1ª como una prioridad mayor que la 2, la 2 como una prioridad mayor que la 3ª, y así sucesivamente …

    Espero Que Esto Ayude.

    • Este tiene el mejor rendimiento en comparación con la secuencia de comandos basado en la coloración de las soluciones. Gracias!
  5. 3

    De probar los maravillosos rpen http://github.com/rtulke/rpen

    require egrep or grep

    Ahora usted necesita una copia de la rpen.py archivo en la carpeta de la derecha y darle adecuada de los derechos

    cp rpen.py /usr/local/bin/rpen
    chmod 777 /usr/local/bin/rpen

    a continuación, intente

    ps xau |rpen Ss "S\+" "\?\?" 
    • En cygwin, he encontrado la rpen instalación muy fácil. Yo no podía conseguir ack y h a trabajar. Ejemplo de uso: $ cat ~/.bashrc | rpen alias export
  6. 2

    Así que aquí está la versión(s) utilizando la sed. Digamos que usted quiere que la palabra «ERROR» a ser de color rojo, que sería:

    sed 's/\(ERROR\)/\o033[31m\o033[39m/'

    Tener a toda línea que contenga la palabra «ERROR» marcado en rojo:

    sed 's/\(.*ERROR.*\)/\o033[31m\o033[39m/'

    Tener varias palabras marcadas en rojo:

    sed 's/\(ERROR\|FAILED\)/\o033[31m\o033[39m/'

    Tener varias palabras y sus wohle líneas marcadas en rojo:

    sed 's/\(.*FAILED.*\|.*ERROR.*\)/\o033[31m\o033[39m/'

    Tener varios colores (ERROR=rojo/FAILED=azul)

    sed -e 's/\(ERROR\)/\o033[31m\o033[39m/' -e 's/\(FAILED\)/\o033[34m\o033[39m/'

    A usar todo esto a través de ssh:

    ssh [email protected] -t "tail -n 1024 -f /some/log/file | sed --unbuffered -e 's/\(.*ERROR.*\|.*FAILED.*\)/\o033[31m\o033[39m/' -e 's/\(.*postfix.*\|.*dhcpd.*\)/\o033[32m\o033[39m/'"

    Y para no tener que escribir esto cada vez, acaba de declarar como una función en el bashrc.

    Para otros colores de buscar ANSI codes.

  7. 1

    ¿Qué hay de esto? Usted puede hacerlo con grep SÓLO! Trucos aquí son (1) toma /O/de las palabras que están buscando; (2) utilizar-a y-B opciones con los bastante grandes números (mayor que el número de línea de su archivo).

    echo "you make it" > tmp
    echo "you take it" >> tmp
    echo "you cake it" >> tmp
    echo "you bake it" >> tmp
    echo "you wake it" >> tmp
    
    GREP_COLOR='1;32' grep -P "(take|cake|bake)" --color=always tmp | GREP_COLOR='1;33' grep -P "(cake|bake)" --color=always -A10000 -B10000 | GREP_COLOR='1;34' grep -P "(bake)" --color=always -A10000 -B10000 
    • no trabajo con «tail -f»
  8. 1

    cxpgrep es adecuado para este propósito resaltar patrones en diferentes colores.

    cxpgrep 'PAT1|PAT2|...' FILE_OR_DIRECTORY

Dejar respuesta

Please enter your comment!
Please enter your name here