Совпадение цветов, но печать других строк тоже

У меня есть псевдоним: alias grep='grep --color=auto' . Я хочу иметь способ напечатать не только совпадающую строку, но и все, и только шаблоны соответствия цвета. Я сомневаюсь, что есть возможность сделать это в самой grep . Любой другой инструмент? Или идея, как этого достичь?

  • Изоляция строки в / etc / passwd, которая содержит «строку», используя grep
  • Сравнить awk vs. grep
  • Поиск в корзине s3 с журналами
  • соответствие шаблону grep
  • как совместить слова и игнорировать пробелы
  • Каков максимальный диапазон символов grep в bash?
  • Использование как Grep, так и Cut
  • grep для нескольких строк в файлах, а затем список файлов в порядке размера
  • 4 Solutions collect form web for “Совпадение цветов, но печать других строк тоже”

    Вы можете сделать трюк с опцией -E :

     grep -E '(^|pattern)' file 

    Вот простой вывод:

    введите описание изображения здесь

    Вы можете сделать это, используя бит sed и терминальную магию:

     $ sed -e 's/<pattern>/\x1b[31;01m&\x1b[m/g' <file> 

    Это заменяет каждое вхождение <pattern> совпадающим текстом, окруженным \x1b[31;01m (это конечная escape-последовательность для «заданного цвета переднего плана, выделенного жирным красным цветом») и \x1b[m (то же самое для «установленного цвета переднего плана по умолчанию").

    Я написал небольшой скрипт, который будет окрашивать любую строку, которую вы ему даете:

     #!/usr/bin/env perl use Getopt::Std; use strict; use Term::ANSIColor; my %opts; getopts('hic:l:',\%opts); if ($opts{h}){ print<<EoF; Use -l to specify the pattern(s) to highlight. To specify more than one pattern use commas. -l : A Perl regular expression to be colored. Multiple expressions can be passed as comma separated values: -l foo,bar,baz -i : makes the search case sensitive -c : comma separated list of colors; EoF exit(0); } my $case_sensitive=$opts{i}||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'); if ($opts{c}) { @color=split(/,/,$opts{c}); } my @patterns; if($opts{l}){ @patterns=split(/,/,$opts{l}); } else{ $patterns[0]='\*'; } # 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 в каталоге, который находится в вашем $PATH и сделайте его исполняемым ( chmod +x /usr/bin/color ), вы можете покрасить соответствующий шаблон следующим образом:

     echo -e "foo\nbar\nbaz\nbib" | color -l foo,bib 

    Это даст:

    введите описание изображения здесь

    Как написано, сценарий имеет предопределенные цвета для 10 разных шаблонов, поэтому, давая ему список, разделенный запятыми, как у меня в приведенном выше примере, будет окрашивать каждый из шаблонов, соответствующих другому цвету.

    Это встроенный в ack цветной выход по умолчанию, а опция --passthru печатает все строки.

    Linux и Unix - лучшая ОС в мире.