bash - utilizar - Colorized grep-viendo el archivo completo con coincidencias resaltadas
grep varias palabras (16)
Agregué esto a mis .bash_aliases:
highlight() {
grep --color -E "$1|/$"
}
Me parece que la grep
--color=always
grep
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 de patrones resaltadas.
¿Hay alguna manera en que pueda decirle a grep que imprima cada línea que se lee sin importar 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 por si esto era posible con el grep
estándar.
Alternativamente, puedes usar The Silver Searcher y hacer
ag <search> --passthrough
Aquí hay algo en la misma línea. Es probable que, de todos modos, uses menos, así que prueba esto:
less -p pattern file
Resaltará el patrón y saltará a la primera aparición en el archivo.
Aquí hay algunas maneras de hacerlo:
grep --color -E ''pattern|$'' file
grep --color ''pattern/|$'' file
egrep --color ''pattern|$'' file
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 brillante:
#! /bin/bash
awk -vstr=$1 ''BEGIN{repltext=sprintf("%c[1;31;40m&%c[0m", 0x1B,0x1B);}{gsub(str,repltext); print}'' $2
Úsalo así:
$ ./cgrep pattern [file]
Desafortunadamente, no tiene toda la funcionalidad de grep.
Para obtener más información, puede consultar el artículo " So You Like Color " en Linux Journal.
Me gustaría recomendar ack, mejor que grep, una herramienta de búsqueda poderosa para programadores .
$ ack --color --passthru --pager="${PAGER:-less -R}" pattern files
$ ack --color --passthru pattern files | less -R
$ export ACK_PAGER_COLOR="${PAGER:-less -R}" $ ack --passthru pattern files
Me encanta porque utiliza de forma predeterminada la búsqueda recursiva de directorios (y es mucho más inteligente que grep -r
), admite expresiones regulares de Perl completas (en lugar de la expresión regex(3)
POSIXish regex(3)
) y tiene una pantalla de contexto mucho más agradable cuando se buscan muchos archivos. .
Ok, esta es una forma,
wc -l filename
le dará el recuento de líneas - diga NN, entonces usted puede hacer
grep -C NN --color=always filename
Otra respuesta mencionó el interruptor-gn de grep que incluye n líneas de contexto. A veces hago esto con n = 99 como una forma rápida y sucia de obtener [al menos] una pantalla llena de contexto cuando el patrón de egrep parece demasiado delicado, o cuando estoy en una máquina en la que no he instalado rcg y / o ccze.
Recientemente descubrí ccze
que es un colorizador más potente. Mi única queja es que está orientado a la pantalla (como less
, que nunca uso por esa razón) a menos que especifique el interruptor -A para la salida "ANSI sin procesar".
+1 para la mención rcg
anterior. Sigue siendo mi favorito ya que es tan sencillo de personalizar en un alias. Algo como esto suele estar en mi ~ / .bashrc:
alias tailc = ''tail -f / my / app / log / file | rcg enviar "BOLD GREEN" recibe "CYAN" error "RED" ''
Para resaltar patrones mientras se ve el archivo completo, h puede hacer esto.
Además utiliza 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 un buen ajuste.
Puede usar mi script de highlight
desde https://github.com/kepkin/dev-shell-essentials
Es mejor que grep
porque puedes resaltar cada partido con su propio color .
$ command_here | highlight green "input" | highlight red "output"
Si desea resaltar varios patrones con diferentes colores, consulte this script de bash.
Uso básico:
echo warn error debug info 10 nil | colog
Puede cambiar los patrones y los colores mientras se ejecuta presionando una tecla y luego la tecla Intro.
También puede 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 así: " ifconfig | grepe inet
" o " grepe css index.html
".
(PD: no olvide la source ~/.bashrc
para volver a cargar Bashrc en la sesión actual)
Usa el programa colout
: http://nojhan.github.io/colout/
Está diseñado para agregar resaltes de color a una secuencia de texto. Dada una expresión regular y un color (por ejemplo, "rojo"), reproduce un flujo de texto con coincidencias resaltadas. p.ej:
# cat logfile but highlight instances of ''ERROR'' in red
colout ERROR red <logfile
Puede encadenar múltiples invocaciones para agregar múltiples resaltes de colores 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 grupos N (partes entre paréntesis de la expresión regular), seguida de una lista de N colores separados por comas.
vagrant status | /
colout /
''/'''(^.+ running)|(^.+suspended)|(^.+not running)''/''' /
green,yellow,red
Yo uso el siguiente comando para propósitos similares:
grep -C 100 searchtext file
Esto dirá grep para imprimir 100 * 2 líneas de contexto, antes y después del texto de búsqueda resaltado.
Yo uso rcg de "Linux Server Hacks", O''Reilly. Es perfecto para lo que quieres 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
}
otra manera sucia:
grep -A80 -B80 --color FIND_THIS IN_FILE
Hice un
alias grepa=''grep -A80 -B80 --color''
en bashrc.