Utilizzo di una riga vuota come "separatore di gruppi" di contesto per grep


12

Ho bisogno dell'output grep con contesto, a colori e righe vuote come separatore di gruppo. In questa domanda , ho imparato a definire l'abitudine group-separatore ho costruito il mio comando grep in questo modo:

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

ma il separatore di gruppo in realtà non è vuoto, invece contiene ancora il codice colore (cioè [[36m[[K[[m[[K). Questo perché sto usando --color=always. Ma ho bisogno di colore nel mio comando grep e ho bisogno che il separatore sia una riga vuota (per ulteriori elaborazioni)

Come posso combinare queste due condizioni?


Se hai --color=alwaysla corrispondenza, verrà stampata con il colore e se hai --group-separator=""impostato la stringa vuota, dopo il gruppo corrispondente otterrai una riga vuota. Riprovare a lasciare la --group-separator=""stringa vuota, non una fuga di colori specifica, quindi spiegare cosa non funziona.
bsd

@bdowning è quello che ha provato l'OP. Il codice che menziona non è visibile nell'output del terminale. Prova a passare attraverso l'output od -cper vedere i caratteri nascosti che compaiono nelle righe vuote.
terdon

@terdon, lo vedo con od.
bsd

Risposte:


9

Se si utilizza la GREP_COLORSvariabile di ambiente, è possibile controllare colori specifici per ciascun tipo di corrispondenza. man grepspiega l'uso della variabile.

Il comando seguente stamperà una corrispondenza colorata, ma nulla sulla riga che separa il gruppo, solo una riga vuota. Inoltrato odvedrai il colore sfuggire prima e dopo la partita, ma solo \n\nalla separazione del gruppo.

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

Disattivando il secomponente, la stampa del colore verrà soppressa nel separatore di gruppo.

Poiché il mio esempio precedente ha usato anche tutti i valori predefiniti per GREP_COLORSquanto segue funzionerà.

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

Se non si utilizza una bashshell simile, potrebbe essere necessario esportare GREP_COLORSprima.


5

Personalmente, lo faccio usando Perl, no grep. Ho una piccola sceneggiatura che evidenzierà un determinato motivo a colori:

#!/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 lo salvi nel tuo percorso come color, puoi ottenere l'output desiderato eseguendo

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

In questo modo, la sceneggiatura sta colorando le corrispondenze per te e puoi dire di grepnon usare i colori ed evitare questo problema.


Si prega, @terdon aggiungerlo a una sostanza , e collegarlo di nuovo qui, in modo che sarà più facile da seguire alcuna evoluzione.
Rafareino,

@Rafareino sì, temo di non usare davvero questi strumenti. In realtà ho un repository ma è molto raramente aggiornato. Continuo a volerne impostarne uno e usarlo correttamente, ma non mi sembra mai di aggirarlo.
terdon

Quindi ho fatto una piccola correzione proprio qui, purtroppo, ho dovuto includere un commento per raggiungere il minimo edit @terdon
Rafareino
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.