Используя пустую строку как контекст “разделитель группы” для grep

Эта группа создается libcgroup пакет, который является действительно API для контрольных групп.

12
23.05.2017, 14:33
2 ответа

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

Следующая команда распечатает цветное соответствие, но ничто на строке, которая разделяет группу, просто пустая строка. Переданный по каналу через od Вы будете видеть цветной Escape прежде и после соответствия, но только \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

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

9
27.01.2020, 19:55

Лично, я делаю тот 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 не использовать цвета и избегать этой проблемы.

5
27.01.2020, 19:55
  • 1
    @terdon добавляют его к сути и связывают его назад здесь, таким образом, будет легче следовать за любой эволюцией. –  Rafareino 20.08.2015, 01:40
  • 2
    @Rafareino да, я боюсь, что действительно не использую такие инструменты. У меня действительно на самом деле есть репозиторий, но он очень редко обновляется. Я продолжаю означать настраивать один и использовать его правильно, но я никогда, кажется, не возвращаюсь к нему. –  terdon♦ 03.09.2015, 15:18
  • 3
    Таким образом, я сделал маленькое исправление прямо здесь, к сожалению, я должен был включать комментарий для достижения минимального @terdon –  Rafareino 04.09.2015, 17:17

Теги

Похожие вопросы