Использование пустой строки в качестве контекста «разделитель группы» для grep


12

Мне нужен вывод grep с контекстом, цветом и пустыми строками в качестве разделителя групп. В этом вопросе я узнал, как определить custom group-separator, и я построил свою команду grep следующим образом:

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

но разделитель группы на самом деле не пуст, вместо этого он все еще содержит код цвета (т.е. [[36m[[K[[m[[K). Это потому что я использую --color=always. Но мне нужен цвет в моей команде grep и разделитель должен быть пустой строкой (для дальнейшей обработки)

Как я могу объединить эти два условия?


Если у вас есть --color=alwaysсовпадение, оно будет напечатано с цветом, и если у вас есть --group-separator=""набор для пустой строки, вы получите пустую строку после вашей совпадающей группы. Пожалуйста, попробуйте еще раз оставить --group-separator=""пустую строку, а не конкретный цвет, а затем объясните, что не работает.
BSD

@bdowning это то, что пытался ОП. Код, который он упоминает, не виден в выводе терминала. Попробуйте передать вывод, od -cчтобы увидеть скрытые символы, которые появляются в пустых строках.
Тердон

@terdon, я вижу это с od.
BSD

Ответы:


9

Если вы используете GREP_COLORSпеременную окружения, вы можете управлять определенными цветами для каждого типа соответствия. man grepобъясняет использование переменной.

Следующая команда напечатает цветное совпадение, но ничего в строке, разделяющей группу, только пустая строка. Пройдя через канал, odвы увидите исчезновение цвета до и после матча, но только \n\nпри разделении группы.

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

Отключение seкомпонента будет подавлять печать цвета в разделителе группы.

Так как мой пример выше использовал все значения по умолчанию для GREP_COLORSследующего, будет работать также.

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

Если вы не используете bashподобную оболочку, вам может понадобиться GREP_COLORSсначала выполнить экспорт .


5

Лично я делаю это, используя Perl, а не grep. У меня есть небольшой скрипт, который выделит данный шаблон цветом:

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

Если вы сохраните это в своем пути как color, вы можете получить желаемый результат, запустив

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

Таким образом, скрипт раскрашивает спички для вас, и вы можете сказать grepне использовать цвета и избежать этой проблемы.


Пожалуйста, @terdon добавить его в сущности , и связать его обратно сюда, так будет легче следовать любой эволюции.
Rafareino

@Rafareino Да, боюсь, я не пользуюсь такими инструментами. У меня действительно есть хранилище, но оно очень редко обновляется. Я продолжаю иметь в виду настроить его и правильно его использовать, но, кажется, я никогда не обращаюсь к нему.
Тердон

Поэтому я внес небольшую поправку прямо здесь, к сожалению, мне нужно было добавить комментарий, чтобы достичь минимума правки @terdon
Rafareino
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.