Pregunta:
"Grep" que destaca en lugar de filtrar
ordago
2014-12-05 13:47:33 UTC
view on stackexchange narkive permalink

Me preguntaba si hay un programa en el conjunto de herramientas común de Unix como grep que, en lugar de filtrar las líneas que contienen una cadena, simplemente genera la misma entrada pero resaltando o coloreando la cadena seleccionada.

Estaba pensando en hacerlo por mí mismo (debería ser bastante simple), pero tal vez ya existe como un comando de Unix.

Estoy planeando usarlo para monitorear registros, así que haría algo como esto :

  tail -f logfile.log | resaltar "error"  

Por lo general, cuando estoy monitoreando registros, necesito encontrar una cadena en particular, pero también necesito saber qué está escrito antes y después de la cadena, por lo que el filtrado a veces no es suficiente .

¿Existe algo así?

Gracias

Bastante respondido aquí: http://stackoverflow.com/questions/981601/colorized-grep-viewing-the-entire-file-with-highlight-matches
Esto me parece fuera de tema, ya que no está pidiendo una aplicación. Sin duda, sería mejor preguntar en https://unix.stackexchange.com/
Catorce respuestas:
#1
+26
fedorqui
2014-12-05 16:44:24 UTC
view on stackexchange narkive permalink

Este es un truco divertido con el comando básico grep . Consiste en utilizar dos filtros: el que quieres aplicar y otro ficticio que coincide con todas las líneas pero no produce resaltado. Esta coincidencia ficticia puede ser ^ (comienzo de línea) o $ (final de línea).

  grep "^ \ | text "--color = archivo 'siempre'  

o

  grep -E" ^ | text "--color = archivo 'siempre'  código > 

Vea un ejemplo:

  $ cat ahello este es un texto que quería compartir con usted $ grep "^ \ | text" --color = 'always' ahello este es un texto que quería # "texto" está resaltado para compartir contigo  
Parece que ni siquiera necesitas `^` o `$` y solo `" | texto "` también funciona.
#2
+8
user450
2014-12-05 14:54:22 UTC
view on stackexchange narkive permalink

Existe una herramienta llamada ack . Puede encontrarlo en http://beyondgrep.com y, de hecho, es una herramienta más allá de grep. Su uso más común es el llenado de esa función de find. -nombre "* .java" --print | xargs grep clazz o similares. Porque hacemos eso todo el tiempo.

Simplemente ack clazz y obtendrá el resultado. Busca los archivos adecuados (no se molesta en tratar de grep binarios) y también da una salida de color agradable.

Si lo usa con la opción --passthru , imprimirá el flujo de entrada completo, resaltando las regiones coincidentes en color.

--passthru Imprime todas las líneas, ya sean coincidentes o no

Como indica la documentación, si se usa - para el archivo, tomará STDIN:

Si se especifica algún archivo o directorio, solo se verifican esos archivos y directorios . ack también puede buscar STDIN, pero solo si no se especifican argumentos de directorio o archivo, o si uno de ellos es "-".

Por lo tanto, perdone el cat abuso ( y el juego de palabras - ver más abajo ) puedes tenerlo:

  $ cat file | ack --passthru patrón $ archivo cat | ack --passthru pattern -  

Esto tomará la salida de la tubería y la enviará a través de ack que imprimirá todas las líneas (con - -passthru ) con el patrón resaltado.

Esta es exactamente la herramienta que está buscando (y un poco más). Es un paquete estándar para muchos administradores de paquetes. Consulte http://beyondgrep.com/install/ para ver su favorito.

 _ /|\'o.O'=(___)= U ack --thpppt! 

(Si no lo reconoce, ese es Bill the Cat, aunque la búsqueda de imágenes también podría ayudar; no haga clic en el conjunto de Miley Cyrus )

Ack es una gran herramienta, pero ¿cómo puede imprimir toda su entrada simplemente resaltando el patrón de búsqueda? Normalmente se usa como una forma de "grep -R" dirigido como usted explica, no veo cómo puede ayudar al OP.
@terdon la opción `--passthru` imprimirá todas las líneas y resaltará los patrones de interés. Del mismo modo, para trabajar en STDIN, se puede utilizar el guión como el 'nombre' del archivo, o ningún argumento de archivo.
Ya veo, eso tiene sentido. Como dijiste que actúa como grep, asumí que solo imprimiría la línea correspondiente.
@terdon su modo predeterminado es grepy. Aunque, como la gente ha estado señalando con otras opciones, se puede engañar a grep para que imprima todas las líneas y resalte el texto de interés. ack no necesita ser engañado para hacer eso, es una de las opciones estándar. Y gracias por la edición aclaratoria.
#3
+5
Steve Barnes
2014-12-05 14:04:50 UTC
view on stackexchange narkive permalink

Puede usar la bandera grep -C que proporciona n líneas de contexto, por ejemplo grep -C 3 imprimirá las 3 líneas antes y después de la coincidencia. También hay -B y -A para antes y después.

Si está buscando resaltar cadenas determinadas con regularidad, p. Ej. formatos de registro específicos, podría valer la pena usar python pygmentize con un lexer personalizado, dado que se basa en expresiones regulares, se sorprenderá de lo fácil que es . Este último también tiene la ventaja de ser multiplataforma, aunque algunos terminales no hacen muy bien el color.

#4
+4
terdon
2014-12-06 18:17:12 UTC
view on stackexchange narkive permalink

He escrito un pequeño script que coloreará cualquier cadena que le des:

  #! / usr / bin / env perluse Getopt :: Std; use strict; use Term :: ANSIColor; my% opts; getopts ('hic: l:', \% opts); if ($ opts {h}) {print<<EoF; Utilice -l para especificar los patrones que desea resaltar. Para especificar más de un patrón, use comas. -l: Una expresión regular de Perl que se va a colorear. Se pueden pasar varias expresiones como valores separados por comas: -l foo, bar, baz-i: hace que la búsqueda distinga entre mayúsculas y minúsculas-c: lista de colores separados por comas; } my $ case_sensitive = $ opts {i} || undef; my @color = ('negrita roja', 'negrita azul', 'negrita amarilla', 'negrita verde', 'negrita magenta', 'negrita cian', ' amarillo sobre_magenta ',' blanco_brillante sobre_rojo ',' amarillo_brillante sobre_rojo ',' blanco sobre_negro '); if ($ opts {c}) {@ color = split (/, /, $ opts {c});} mis @patterns; if ($ opts {l}) {@ patterns = split (/, /, $ opts {l});} else {$ patterns [0] = '\ *';} # Configuración $ | a distinto de cero fuerza un vaciado inmediato y # después de cada escritura o impresión en el canal de salida seleccionado actualmente. $ | = 1; while (my $ line = <>) {for (my $ c = 0; $ c< = $ # patrones; $ c ++) {if ($ case_sensitive) {if ($ línea = ~ / $ patrones [$ c] /) {$ línea = ~ s / ($ patrones [$ c]) / color ("$ color [$ c]"). $ 1.color ("restablecer") / ge; }} else {if ($ línea = ~ / $ patrones [$ c] / i) {$ línea = ~ s / ($ patrones [$ c]) / color ("$ color [$ c]"). $ 1. color ("reiniciar") / ige; }}} imprimir STDOUT $ line;}  

Si lo guarda como color en un directorio que está en su $ PATH y hágalo ejecutable ( chmod + x / usr / bin / color ), puede colorear el patrón coincidente de esta manera:

  echo -e "foo \ nbar \ nbaz \ nbib "| color -l foo, bib 

Eso producirá:

enter image description here

Tal como está escrito, la secuencia de comandos tiene colores predefinidos para 10 patrones diferentes, por lo que darle una lista separada por comas como lo hice en el ejemplo anterior coloreará cada uno de los patrones que coinciden con un color diferente.

#5
+4
ryanmjacobs
2014-12-07 12:48:54 UTC
view on stackexchange narkive permalink

Soy fanático del resaltador de Paolo Antinori. https://github.com/paoloantinori/hhighlighter

Un lado positivo de este comando es que puede resaltar hasta 10 palabras con colores únicos. Simplemente canalice la salida de un comando a h con las palabras para resaltar.

Ej. tail -f /var/log/somelog.log | h "ERROR" producirá:

demo-1


Algunos ejemplos de su sitio:

demo-2 demo-3

#6
+3
slebetman
2014-12-05 18:29:39 UTC
view on stackexchange narkive permalink

Escribí un programa para hacer esto hace algún tiempo. Lo llamo cgrep (para color grep).

Puede descargarlo copiando la sección de código de aquí en un archivo vacío: http://wiki.tcl.tk/38096

Luego haga que el archivo sea ejecutable y cópielo en uno de sus directorios bin habituales.

Está escrito en tcl, por lo que necesita tcl instalado (8.5 y superior). Pero la mayoría de las distribuciones de Linux tendrían instalado tcl de todos modos, ya que muchos programas lo usan (gitk, kernel config, wait, etc.).

La sintaxis para colorear es simple: opción de regex opción .. . Puede tener tantas expresiones regulares como desee. Aquí hay un ejemplo que colorearía los errores en rojo y las advertencias en amarillo:

  tail -f logfile | cgrep '^. * ADVERTENCIA. * $' -fg amarillo '^. * ERROR. * $' -fg rojo -bg amarillo  
#7
+3
Zandriy
2018-08-01 21:13:32 UTC
view on stackexchange narkive permalink

La forma más sencilla se ve así, creo:

  tail -f logfile.log | grep -e 'error' -e '**'  

enter image description here

No es necesario instalar nada.

#8
+2
John V
2014-12-06 02:05:41 UTC
view on stackexchange narkive permalink

Bueno, estoy ejecutando Fedora 21 y si escribo

  grep -E \ | kk rs.c  

generará el resultado completo contenido del archivo "rs.c" mientras se resalta cualquier aparición de "kk".

Eso es básicamente lo mismo que la [respuesta de arielCo] (http://softwarerecs.stackexchange.com/a/14435/185).
@Izzy: Sin embargo, la sintaxis es más corta, por lo que diría que califica como una respuesta válida diferente.
@NicolasRaoul es por eso que solo dejé un comentario en ese entonces (pero no marqué). Básicamente, esperaba que el póster se expandiera un poco;)
#9
+1
arielCo
2014-12-05 21:43:02 UTC
view on stackexchange narkive permalink

Un truco simple es hacer coincidir también una cadena vacía o el comienzo de una línea; cualquiera da como resultado una coincidencia de longitud cero para todas las líneas:

  grep --color -e 'REGEXP' -e '' grep --color -e 'REGEXP' -e ^  

O (sintaxis de expresiones regulares extendida):

  grep --color -E 'REGEXP |' egrep --color 'REGEXP |'  
¿No filtraría también la primera variante la salida de `REGEX`? Solo lo intenté y lo hace. Entonces eso no coincide con los requisitos (solo resaltar, no filtrar). Pero la segunda variante de hecho hace lo que solicitó el OP (verificado;).
@Izzy: Lo siento, tuve un error tipográfico. ¡Gracias!
Sí, eso tiene sentido ahora :) Filtre por `REGEX` (resalta ese término) y por" nada "(que está" en todas partes "). ¿Puedo sugerirle que incluya esta pequeña explicación (también aclare lo que hace), y luego borremos nuestros comentarios (para la limpieza)? ¡Gracias! Mientras tanto, +1 de mí :)
Lo haré, pero Fedorqui dio esencialmente la misma respuesta anterior (supongo que no la vi cuando publiqué la mía).
Tengo que admitir que tampoco vi eso ... (pista: no hay "arriba" ni "abajo", ya que el orden de las respuestas depende del filtro que hayas configurado;)
#10
+1
Steven Penny
2014-12-07 10:59:49 UTC
view on stackexchange narkive permalink

Puede usar este comando

  grep --color --context = 1000  

O más corto

  grep --col -1000  

explicahell.com - grep --color --context

#11
+1
asmeurer
2014-12-08 00:54:09 UTC
view on stackexchange narkive permalink

Utilice menos . La cadena de búsqueda encontrada por / es una expresión regular y las ocurrencias se resaltarán.

#12
+1
simesy
2018-05-23 04:29:03 UTC
view on stackexchange narkive permalink

En mi .bashrc tengo esta función. Lo llamo cgrep , pero le estoy dando un nombre un poco más adecuado aquí.

  highlight () {grep -E --color "^ | $ 1" ; }  

Encuentro esto útil para seguir registros, por ejemplo, donde quiero resaltar una palabra clave pero veo todo lo que sucede.

  tail -f / var / log / SOMELOG | resaltar PALABRA CLAVE  
Crédito debido: obtuve el "^ |" idea de @fedorqui's respuesta seleccionada. Gracias :)
#13
  0
Monty Harder
2014-12-05 23:37:02 UTC
view on stackexchange narkive permalink

Puede canalizar su salida a:

  sed "s / \ ([Ee] [Rr] [Rr] [Oo] [Rr] \) /` tput rev` \ 1`tput rmso` / " 

Aquí estoy usando una expresión regular que coincidirá con" error "," ERROR "," ErRoR ", etc. en las 32 variaciones posibles.

#14
  0
Benedikt Köppel
2014-12-07 04:48:33 UTC
view on stackexchange narkive permalink

Tengo la siguiente función definida en mi ~/.zshrc:

  hl () {sed s / $ 1 / $ '\ e [1; 31m '\ & $' \ e [0; m '/}  

Úselo con tail -f logfile.log | hl "error" . Agrega una secuencia de escape para Light Red antes de la palabra resaltada y se restablece a ningún color después de la palabra. Puede encontrar otros códigos de color aquí: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html



Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...