bash cómo - Colorized grep-viendo el archivo completo con coincidencias resaltadas




test? líneas (14)

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" '

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.


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

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.


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.


otra manera sucia:

grep -A80 -B80 --color FIND_THIS IN_FILE

Hice un

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

en bashrc.


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)


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.


Agregué esto a mis .bash_aliases:

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

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"


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
}

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.


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

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. .


adecuado para el archivo .alias tcsh:

alias gisrc 'grep -I -r -i --exclude="*\.svn*" --include="*\."{mm,m,h,cc,c} \!* *'

Me tomó un tiempo descubrir que la porción {mm, m, h, cc, c} NO debería estar entre comillas. ~ Keith





bash shell colors grep