Grep coloreado: ver el archivo completo con coincidencias resaltadas

Creo que grep ‘s --color=always flag es tremendamente útil. Sin embargo, grep solo imprime líneas con coincidencias (a menos que solicite líneas de contexto). Dado que cada línea que imprime tiene una coincidencia, el resaltado no agrega tanta capacidad como podría.

Realmente me gustaría cat un archivo y ver el archivo completo con las coincidencias del patrón resaltadas.

¿Hay alguna forma en que pueda decirle a grep que imprima cada línea que se lee independientemente de si hay una coincidencia? Sé que podría escribir un script para ejecutar grep en cada línea de un archivo, pero tenía curiosidad si esto era posible con grep estándar.

Aquí hay algunas maneras de hacerlo:

 grep --color -E 'pattern|$' file grep --color 'pattern\|$' file egrep --color 'pattern|$' file 

Aquí hay algo en la misma línea. Lo más probable es que use menos de todos modos, así que intente esto:

 less -p pattern file 

Resaltará el patrón y saltará a la primera aparición del mismo en el archivo.

Me gustaría recomendar ack, mejor que grep, una herramienta de búsqueda de poder para progtwigdores .

 $ ack --color --passthru --pager = "$ {PAGER: -less -R}" archivos de patrones
 $ ack --color --passthru archivos de patrones |  menos -R
 $ export ACK_PAGER_COLOR = "$ {PAGER: -less -R}"
 $ ack --passthru archivos de patrones

Me encanta porque se utiliza de forma predeterminada en la búsqueda recursiva de directorios (y es mucho más inteligente que grep -r ), admite expresiones regulares completas de Perl (en lugar de la expresión regex(3) POSIXish regex(3) ) y tiene una pantalla de contexto mucho más agradable cuando busca muchos archivos .

También puedes crear un alias. Agregue esta función en su .bashrc (o .bash_profile en osx)

 function grepe { grep --color -E "$1|$" $2 } 

Ahora puede usar el alias de esta manera: ” ifconfig | grepe inet ” o ” grepe css index.html “.

(PD: no se olvide de source ~/.bashrc para volver a cargar bashrc en la sesión actual)

Puede usar mi script de highlight desde https://github.com/kepkin/dev-shell-essentials

Es mejor que grep porque puedes resaltar cada coincidencia con su propio color .

 $ command_here | highlight green "input" | highlight red "output" 

Captura de pantalla del proyecto Github

Utilice el progtwig de colout : http://nojhan.github.io/colout/

Está diseñado para agregar reflections de color a una secuencia de texto. Dada una expresión regular y un color (por ejemplo, “rojo”), reproduce una secuencia de texto con coincidencias resaltadas. p.ej:

 # cat logfile but highlight instances of 'ERROR' in red colout ERROR red  

Puede encadenar múltiples invocaciones para agregar múltiples realces de color diferentes:

 tail -f /var/log/nginx/access.log | \ colout ' 5\d\d ' red | \ colout ' 4\d\d ' yellow | \ colout ' 3\d\d ' cyan | \ colout ' 2\d\d ' green 

O puede lograr lo mismo utilizando una expresión regular con N grupos (partes entre paréntesis de la expresión regular), seguida de una lista separada por comas de N colores.

 vagrant status | \ colout \ '\''(^.+ running)|(^.+suspended)|(^.+not running)'\'' \ green,yellow,red 

Uso rcg de “Linux Server Hacks”, O’Reilly. Es perfecto para lo que desea y puede resaltar múltiples expresiones, cada una con diferentes colores.

 #!/usr/bin/perl -w # # regexp coloured glasses - from Linux Server Hacks from O'Reilly # # eg .rcg "fatal" "BOLD . YELLOW . ON_WHITE" /var/adm/messages # use strict; use Term::ANSIColor qw(:constants); my %target = ( ); while (my $arg = shift) { my $clr = shift; if (($arg =~ /^-/) | !$clr) { print "Usage: rcg [regex] [color] [regex] [color] ...\n"; exit(2); } # # Ugly, lazy, pathetic hack here. [Unquote] # $target{$arg} = eval($clr); } my $rst = RESET; while(<>) { foreach my $x (keys(%target)) { s/($x)/$target{$x}$1$rst/g; } print } 

Agregué esto a mi .bash_aliases:

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

Ok, esta es una forma,

 wc -l filename 

le dará el conteo de líneas – digamos NN, entonces puede hacer

 grep -C NN --color=always filename 

Aquí hay un script de shell que usa la función gsub de Awk para reemplazar el texto que está buscando con la secuencia de escape adecuada para mostrarlo en rojo shiny:

 #! /bin/bash awk -vstr=$1 'BEGIN{repltext=sprintf("%c[1;31;40m&%c[0m", 0x1B,0x1B);}{gsub(str,repltext); print}' $2 

Úselo así:

 $ ./cgrep pattern [file] 

Desafortunadamente, no tiene toda la funcionalidad de grep.

Para obtener más información, puede consultar un artículo ” So You Like Color ” en Linux Journal

Otra respuesta mencionó el interruptor -Cn de grep que incluye n líneas de Contexto. A veces hago esto con n = 99 como una manera rápida y sucia de obtener [al menos] una pantalla llena de contexto cuando el patrón egrep parece demasiado complicado, o cuando estoy en una máquina en la que no he instalado rcg y / o ccze.

Recientemente descubrí ccze que es un colorizante más potente. Mi única queja es que está orientado a la pantalla (como less , que nunca uso por ese motivo) a menos que especifique el modificador -A para la salida “ANSI en bruto”.

+1 para la mención rcg anterior. Todavía es mi favorito, ya que es tan simple de personalizar en un alias. Algo como esto usualmente está en mi ~ / .bashrc:

alias tailc = ‘cola -f / my / app / log / archivo | rcg enviar “BOLD GREEN” recibir “CYAN” error “RED” ‘

otra manera sucia:

 grep -A80 -B80 --color FIND_THIS IN_FILE 

Hice un

 alias grepa='grep -A80 -B80 --color' 

en bashrc.

Alternativamente, puede usar The Silver Searcher y hacer

 ag  --passthrough 

Si desea resaltar varios patrones con diferentes colores, vea este script bash.

Uso básico:

 echo warn error debug info 10 nil | colog 

Puede cambiar los patrones y colores mientras ejecuta presionando una tecla y luego ingrese la clave.

Para resaltar patrones mientras se visualiza todo el archivo, h puede hacerlo.

Además, usa diferentes colores para diferentes patrones.

 cat FILE | h 'PAT1' 'PAT2' ... 

También puede canalizar la salida de h a less -R para una mejor lectura.

Para grep y usar 1 color para cada patrón, cxpgrep podría ser una buena opción .