Utilisation d'une ligne vide comme contexte «séparateur de groupes» pour grep

12

J'ai besoin d'une sortie grep avec contexte, en couleur et des lignes vides comme séparateur de groupe. Dans cette question , j'ai appris à définir la coutume group-separatoret j'ai construit ma commande grep comme ceci:

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

mais le séparateur de groupe n'est en fait pas vide, mais il contient toujours le code de couleur (ie [[36m[[K[[m[[K). C'est parce que j'utilise --color=always. Mais j'ai besoin de couleur dans ma commande grep, et j'ai besoin que le séparateur soit une ligne vierge (pour un traitement ultérieur)

Comment puis-je combiner ces deux conditions?

Martin Vegter
la source
Si vous avez --color=alwaysla correspondance imprimera avec la couleur, et si vous avez --group-separator=""défini la chaîne vide, vous obtiendrez une ligne vierge après votre groupe de correspondance. Veuillez réessayer en laissant le --group-separator=""avec la chaîne vide, pas une séquence de couleurs spécifique, puis expliquez ce qui ne fonctionne pas.
bsd
@bdowning c'est ce que le PO a essayé. Le code qu'il mentionne n'est pas visible dans la sortie du terminal. Essayez de passer la sortie od -cpour voir les caractères cachés qui apparaissent dans les lignes vides.
terdon
@terdon, je le vois avec od.
bsd

Réponses:

9

Si vous utilisez la GREP_COLORSvariable d'environnement, vous pouvez contrôler des couleurs spécifiques pour chaque type de correspondance. man grepexplique l'utilisation de la variable.

La commande suivante imprimera une correspondance colorée, mais rien sur la ligne qui sépare le groupe, juste une ligne vierge. Redirigée vers odvous verrez l'évasion de couleur avant et après le match, mais seulement \n\nà la séparation du groupe.

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

La désactivation du secomposant supprimera l'impression des couleurs dans le séparateur de groupe.

Étant donné que mon exemple ci-dessus a utilisé toutes les valeurs par défaut pour GREP_COLORSles éléments suivants, cela fonctionnera également.

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

Si vous n'utilisez pas un bashshell similaire, vous devrez peut-être d' GREP_COLORSabord exporter .

bsd
la source
5

Personnellement, je le fais en utilisant Perl, non grep. J'ai un petit script qui mettra en évidence un motif donné en couleur:

#!/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 vous enregistrez cela dans votre chemin sous color, vous pouvez obtenir la sortie souhaitée en exécutant

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

De cette façon, le script colorie les correspondances pour vous et vous pouvez dire de grepne pas utiliser de couleurs et d'éviter ce problème.

terdon
la source
S'il vous plaît, @terdon ajoutez-le à un résumé et liez-le ici, il sera donc plus facile de suivre toute évolution.
Rafareino
@Rafareino ouais, j'ai bien peur de ne pas vraiment utiliser de tels outils. J'ai en fait un référentiel mais il est très rarement mis à jour. Je continue à vouloir en installer un et à l'utiliser correctement, mais je ne semble jamais y arriver.
terdon
J'ai donc fait une petite correction ici, malheureusement, je devais inclure un commentaire pour atteindre la modification minimale @terdon
Rafareino