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

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

  • Сравните два файла и сопоставленную строку для отправки в новый файл
  • Как копировать и вставлять строки между ключевым словом start и end?
  • Grep вся строка, которая не начинается с числа (ей)
  • Соответствующая строка с фиксированным количеством символов с использованием grep
  • Как изменить только последнюю строку (или любые конкретные номера строк) с помощью команды awk?
  • Изменение столбцов с помощью awk
  • Bash один вкладыш для изменения параметров конфигурации
  • grep не работает в цикле for по списку
  • Чтение двух файлов в цикл IFS while - есть ли способ получить нулевой результат разбора в этом случае?
  • Удалите повторяющиеся строки из файла, содержащего временную метку
  • Какой смысл перенаправлять вывод grep на / dev / null?
  • Есть ли инструмент, который комбинирует zcat и cat прозрачно?
  • 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 - лучшая ОС в мире.