Usando linha vazia como contexto “separador de grupo” para grep


12

Preciso de saída grep com contexto, em cores e linhas em branco como separador de grupo. Nesta pergunta , eu aprendi como definir custom group-separatore construí meu comando grep assim:

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

mas, na verdade, o separador de grupos não está vazio, mas ainda contém o código de cores (ou seja [[36m[[K[[m[[K). Isso é porque eu estou usando --color=always. Mas preciso de cores no meu comando grep e preciso que o separador seja uma linha em branco (para processamento adicional)

Como posso combinar essas duas condições?


Se você tiver --color=alwaysa correspondência impressa em cores, e se tiver --group-separator=""definido a sequência vazia, receberá uma linha em branco após o grupo correspondente. Tente novamente deixar a --group-separator=""string vazia, sem uma saída de cor específica, e depois explicar o que não está funcionando.
BSD

@downdown é o que o OP tentou. O código que ele menciona não é visível na saída do terminal. Tente passar a saída od -cpara ver os caracteres ocultos que aparecem nas linhas em branco.
terdon

@terdon, eu vejo isso com od.
BSD

Respostas:


9

Se você usar a GREP_COLORSvariável de ambiente, poderá controlar cores específicas para cada tipo de correspondência. man grepexplica o uso da variável

O comando a seguir imprimirá uma correspondência colorida, mas nada na linha que separa o grupo, apenas uma linha em branco. No meio, odvocê verá a cor escapar antes e depois da partida, mas apenas \n\nna separação do grupo.

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

Desativar o secomponente suprimirá a impressão de cores no separador de grupos.

Como o meu exemplo acima usou todos os valores padrão para GREP_COLORSo seguinte também funcionarão.

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

Se você não estiver usando um bashshell semelhante, talvez seja necessário exportar GREP_COLORSprimeiro.


5

Pessoalmente, faço isso usando Perl, não grep. Eu tenho um pequeno script que destacará um determinado padrão em cores:

#!/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;
}

Se você salvar isso no seu caminho como color, poderá obter a saída desejada executando

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

Dessa forma, o script está colorindo as correspondências para você e você pode dizer greppara não usar cores e evitar esse problema.


Por favor, @terdon adicione-o a uma essência e vincule-o aqui, para que seja mais fácil acompanhar qualquer evolução.
Rafareino 19/08/2015

@Rafareino sim, eu tenho medo de não usar essas ferramentas. Na verdade, tenho um repositório, mas raramente é atualizado. Eu mantenho o intuito de configurar um e usá-lo corretamente, mas nunca pareço contornar isso.
terdon

Então eu fiz uma pequena correção aqui, infelizmente, eu precisava incluir um comentário para atingir o mínimo de edição @terdon
Rafareino
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.