Używanie pustej linii jako kontekstowego „separatora grup” dla grep

12

Potrzebuję wyjścia grep z kontekstem, kolorem i pustymi liniami jako separatorem grupy. W tym pytaniu nauczyłem się definiować niestandardowe group-separatori zbudowałem moje polecenie grep w następujący sposób:

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

ale separator grupy w rzeczywistości nie jest pusty, zamiast tego nadal zawiera kod koloru (tj [[36m[[K[[m[[K.). To dlatego, że używam --color=always. Ale potrzebuję koloru w moim poleceniu grep i potrzebuję separatora, aby być pustą linią (do dalszego przetwarzania)

Jak mogę połączyć te dwa warunki?

Martin Vegter
źródło
Jeśli masz --color=alwaysdopasowanie, wydrukuje się w kolorze, a jeśli masz --group-separator=""ustawiony pusty ciąg, otrzymasz pustą linię po dopasowanej grupie. Spróbuj ponownie, pozostawiając --group-separator=""pusty ciąg znaków, a nie określony kolor, a następnie wyjaśnij, co nie działa.
bsd
@bdowning właśnie tego próbował OP. Wspomniany kod nie jest widoczny na wyjściu terminala. Spróbuj przekazać dane wyjściowe, od -caby zobaczyć ukryte znaki, które pojawiają się w pustych wierszach.
terdon
@terdon, widzę to z od.
bsd

Odpowiedzi:

9

Jeśli używasz GREP_COLORSzmiennej środowiskowej, możesz kontrolować określone kolory dla każdego typu dopasowania. man grepwyjaśnia zastosowanie zmiennej.

Poniższe polecenie wyświetli kolorowe dopasowanie, ale nic w linii oddzielającej grupę, tylko pusta linia. Przepuszczony przez odujrzysz ucieczkę koloru przed i po meczu, ale tylko \n\nw separacji grupowej.

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

Wyłączenie sekomponentu spowoduje wyłączenie drukowania kolorów w separatorze grup.

Ponieważ w powyższym przykładzie użyto wszystkich wartości domyślnych dla GREP_COLORSponiższych, również będą działać.

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

Jeśli nie używasz bashpodobnej powłoki, być może będziesz musiał GREP_COLORSnajpierw wyeksportować .

bsd
źródło
5

Osobiście robię to za pomocą Perla, a nie grep. Mam mały skrypt, który podświetli dany wzór w kolorze:

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

Jeśli zapiszesz to na swojej ścieżce jako color, możesz uzyskać pożądaną wydajność, uruchamiając

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

W ten sposób skrypt koloruje dopasowania dla Ciebie i możesz powiedzieć, grepaby nie używać kolorów i uniknąć tego problemu.

terdon
źródło
Proszę @terdon dodać go do GIST , a następnie połączyć je z powrotem tutaj, więc łatwiej będzie śledzić każdą ewolucję.
Rafareino
@Rafareino tak, obawiam się, że tak naprawdę nie używam takich narzędzi. Naprawdę mam repozytorium, ale bardzo rzadko jest aktualizowane. Ciągle mam zamiar skonfigurować jeden i używać go poprawnie, ale nigdy nie wydaje mi się, żeby się do tego przyzwyczaił.
terdon
Więc zrobiłem małą poprawkę tutaj, niestety, musiałem dołączyć komentarz, aby osiągnąć minimum edit @terdon
Rafareino