Leerzeile als Kontext-Gruppentrennzeichen für grep verwenden

12

Ich benötige eine Grep-Ausgabe mit Kontext, Farbe und Leerzeilen als Gruppentrennzeichen. In dieser Frage habe ich gelernt, wie man benutzerdefinierte group-separatorBefehle definiert , und ich habe meinen grep-Befehl folgendermaßen erstellt:

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

Das Gruppentrennzeichen ist jedoch nicht leer, sondern enthält weiterhin den Farbcode (dh [[36m[[K[[m[[K). Das liegt daran, dass ich benutze --color=always. Aber ich brauche Farbe in meinem grep-Befehl, und ich brauche ein Trennzeichen als Leerzeile (für die weitere Verarbeitung)

Wie kann ich diese beiden Bedingungen kombinieren?

Martin Vegter
quelle
Wenn Sie --color=alwaysdie Übereinstimmung haben, wird mit Farbe gedruckt, und wenn Sie --group-separator=""die leere Zeichenfolge festgelegt haben, wird nach Ihrer übereinstimmenden Gruppe eine leere Zeile angezeigt. Bitte versuchen Sie es noch einmal und lassen Sie die --group-separator=""Zeichenfolge leer, nicht eine bestimmte Farbe. Erklären Sie dann, was nicht funktioniert.
bsd
@bdowning das hat das OP versucht. Der von ihm erwähnte Code ist in der Terminalausgabe nicht sichtbar. Versuchen Sie, die Ausgabe durchzuleiten od -c, um die verborgenen Zeichen in den leeren Zeilen zu sehen.
Terdon
@terdon, ich sehe es mit od.
bsd

Antworten:

9

Wenn Sie die GREP_COLORSUmgebungsvariable verwenden, können Sie für jede Übereinstimmungsart bestimmte Farben steuern. man greperklärt die Verwendung der Variablen.

Der folgende Befehl gibt eine farbige Übereinstimmung aus, aber nichts in der Zeile, die die Gruppe trennt, nur eine leere Zeile. Durchgeströmt sehen odSie die Farbe vor und nach dem Spiel, aber nur \n\nbei der Gruppentrennung.

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

Durch Deaktivieren der seKomponente wird das Drucken von Farben im Gruppentrennzeichen unterdrückt.

Da in meinem obigen Beispiel alle Standardwerte für GREP_COLORSFolgendes verwendet wurden, funktioniert dies auch.

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

Wenn Sie keine bashähnliche Shell verwenden, müssen Sie möglicherweise GREP_COLORSzuerst exportieren .

bsd
quelle
5

Persönlich mache ich das mit Perl, nicht grep. Ich habe ein kleines Skript, das ein bestimmtes Muster farblich hervorhebt:

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

Wenn Sie dies in Ihrem Pfad als speichern, colorkönnen Sie die gewünschte Ausgabe erhalten, indem Sie ausführen

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

Auf diese Weise grepfärbt das Skript die Übereinstimmungen für Sie ein und Sie können festlegen, dass keine Farben verwendet werden sollen, um dieses Problem zu vermeiden.

terdon
quelle
Bitte, @terdon, füge es einem Kern hinzu und verlinke es hierher zurück, damit es einfacher wird, jeder Entwicklung zu folgen.
Rafareino
@Rafareino Ja, ich fürchte, ich benutze solche Tools nicht wirklich. Ich habe tatsächlich ein Repository, aber es wird sehr selten aktualisiert. Ich habe weiterhin die Absicht, eine einzurichten und sie richtig zu verwenden, aber ich komme nie dazu.
Terdon
Also habe ich hier eine kleine Korrektur vorgenommen, leider musste ich einen Kommentar hinzufügen, um die minimale Änderung zu erreichen. @Terdon
Rafareino