Usar una línea vacía como contexto "separador de grupos" para grep

12

Necesito salida grep con contexto, en color y líneas en blanco como separador de grupo. En esta pregunta , aprendí a definir la costumbre group-separator, y he construido mi comando grep así:

grep --group-separator="" --color=always -A5

pero el separador de grupo en realidad no está vacío, sino que aún contiene el código de color (es decir [[36m[[K[[m[[K). Esto es porque estoy usando --color=always. Pero necesito color en mi comando grep, y necesito un separador para que sea una línea en blanco (para un procesamiento posterior)

¿Cómo puedo combinar estas dos condiciones?

Martin Vegter
fuente
Si tiene --color=alwaysla coincidencia se imprimirá con color, y si tiene el --group-separator=""conjunto en la cadena vacía, obtendrá una línea en blanco después de su grupo coincidente. Por favor, intente nuevamente dejando la --group-separator=""cadena vacía, no un escape de color específico, y luego explique qué no funciona.
bsd
@bdowning eso es lo que intentó el OP. El código que menciona no es visible en la salida del terminal. Intente pasar la salida od -cpara ver los caracteres ocultos que aparecen en las líneas en blanco.
terdon
@terdon, lo veo con od.
bsd

Respuestas:

9

Si usa la GREP_COLORSvariable de entorno, puede controlar colores específicos para cada tipo de coincidencia. man grepexplica el uso de la variable.

El siguiente comando imprimirá una coincidencia de color, pero nada en la línea que separa el grupo, solo una línea en blanco. Canalizado od, verá el color escapar antes y después del partido, pero solo \n\nen la separación del grupo.

GREP_COLORS='ms=01;31:mc=01;31:sl=:cx=:fn=35:ln=32:bn=32:se=' grep --group-separator="" --color=always -A5

Desarmar el secomponente suprimirá la impresión de color en el separador de grupo.

Como mi ejemplo anterior utilizó todos los valores predeterminados para GREP_COLORSlo siguiente, también funcionará.

GREP_COLORS='se=' grep --group-separator="" --color=always -A5

Si no está utilizando un bashshell similar, es posible que deba exportar GREP_COLORSprimero.

bsd
fuente
5

Personalmente, hago eso usando Perl, no grep. Tengo un pequeño script que resaltará un patrón dado en color:

#!/usr/bin/env perl
use Getopt::Std;
use strict;
use Term::ANSIColor; 

my %opts;
getopts('hsc:l:',\%opts);
    if ($opts{h}){
      print<<EoF; 
DESCRIPTION

$0 will highlight the given pattern in color. 

USAGE

$0 [OPTIONS] -l PATTERN FILE

If FILE is ommitted, it reads from STDIN.

-c : comma separated list of colors
-h : print this help and exit
-l : comma separated list of search patterns (can be regular expressions)
-s : makes the search case sensitive

EoF
      exit(0);
    }

my $case_sensitive=$opts{s}||undef; 
my @color=('bold red','bold blue', 'bold yellow', 'bold green', 
           'bold magenta', 'bold cyan', 'yellow on_magenta', 
           'bright_white on_red', 'bright_yellow on_red', 'white on_black');
## user provided color
if ($opts{c}) {
   @color=split(/,/,$opts{c});
}
## read patterns
my @patterns;
if($opts{l}){
     @patterns=split(/,/,$opts{l});
}
else{
    die("Need a pattern to search for (-l)\n");
}

# Setting $| to non-zero forces a flush right away and after 
# every write or print on the currently selected output channel. 
$|=1;

while (my $line=<>) 
{ 
    for (my $c=0; $c<=$#patterns; $c++){
    if($case_sensitive){
        if($line=~/$patterns[$c]/){
           $line=~s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ge;
        }
    }
    else{
        if($line=~/$patterns[$c]/i){
          $line=~s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ige;
        }
      }
    }
    print STDOUT $line;
}

Si guarda eso en su ruta como color, puede obtener el resultado deseado ejecutando

grep --group-separator="" --color=never -A5 foo | color -l foo

De esa manera, el script está coloreando las coincidencias para usted y puede decirle que grepno use colores y evite este problema.

terdon
fuente
Por favor, @terdon agrégalo a una esencia , y vincúlalo aquí, para que sea más fácil seguir cualquier evolución.
Rafareino
@Rafareino, sí, me temo que realmente no uso esas herramientas. De hecho, tengo un repositorio, pero rara vez se actualiza. Sigo con la intención de configurar uno y usarlo correctamente, pero parece que nunca lo hago.
terdon
Así que hice una pequeña corrección aquí, lamentablemente, necesitaba incluir un comentario para alcanzar la edición mínima @terdon
Rafareino