Colorized grep - просмотр всего файла с выделенными совпадениями - PullRequest
458 голосов
/ 11 июня 2009

Я считаю флаг grep --color=always чрезвычайно полезным. Однако grep печатает только строки с совпадениями (если только вы не запросите контекстные строки). Учитывая, что каждая напечатанная строка имеет соответствие, выделение не добавляет столько возможностей, сколько могло бы.

Я бы очень хотел cat файл и увидеть весь файл с выделенными совпадениями шаблонов.

Есть ли какой-нибудь способ, которым я могу сказать, чтобы grep печатал каждую читаемую строку независимо от того, есть ли совпадение? Я знаю, что мог бы написать скрипт для запуска grep на каждой строке файла, но мне было любопытно, возможно ли это с помощью стандартного grep.

Ответы [ 17 ]

730 голосов
/ 11 июня 2009

Вот несколько способов сделать это:

grep --color -E 'pattern|$' file
grep --color 'pattern\|$' file
egrep --color 'pattern|$' file
84 голосов
/ 12 июня 2009

Вот что-то в том же духе. Скорее всего, вы будете использовать меньше в любом случае, поэтому попробуйте это:

less -p pattern file

Он выделит шаблон и перейдет к его первому появлению в файле.

46 голосов
/ 17 июня 2009

Я бы рекомендовал ack - лучше, чем grep, мощный инструмент поиска для программистов .

$ ack --color --passthru --pager="${PAGER:-less -R}" pattern files
$ ack --color --passthru pattern files | less -R
$ export ACK_PAGER_COLOR="${PAGER:-less -R}"
$ ack --passthru pattern files

Мне это нравится, потому что по умолчанию используется рекурсивный поиск по каталогам (и он намного умнее grep -r), поддерживает полные регулярные выражения Perl (а не POSIXish regex(3)) и гораздо более приятное отображение контекста при поиске во многих файлах.

18 голосов
/ 30 апреля 2014

Вы также можете создать псевдоним. Добавьте эту функцию в ваш .bashrc (или .bash_profile на osx)

function grepe {
    grep --color -E "$1|$" $2
}

Теперь вы можете использовать псевдоним: «ifconfig | grepe inet» или «grepe css index.html».

(PS: не забудьте source ~/.bashrc перезагрузить bashrc в текущем сеансе)

17 голосов
/ 18 августа 2014

Вы можете использовать мой highlight скрипт из https://github.com/kepkin/dev-shell-essentials

Это лучше , чем grep, потому что вы можете выделить каждый матч его собственным цветом .

$ command_here | highlight green "input" | highlight red "output"

Screen shot from Github project

12 голосов
/ 19 июня 2015

Использование colout Программа: http://nojhan.github.io/colout/

Предназначен для добавления цветных бликов в текстовый поток. Имея регулярное выражение и цвет (например, «красный»), он воспроизводит текстовый поток с выделенными совпадениями. например:

# cat logfile but highlight instances of 'ERROR' in red
colout ERROR red <logfile

Вы можете объединить несколько вызовов в цепочку, чтобы добавить несколько разных цветов:

tail -f /var/log/nginx/access.log | \
    colout ' 5\d\d ' red | \
    colout ' 4\d\d ' yellow | \
    colout ' 3\d\d ' cyan | \
    colout ' 2\d\d ' green

Или вы можете достичь того же, используя регулярное выражение с N группами (части регулярного выражения в скобках), за которым следует разделенный запятой список из N цветов.

vagrant status | \
    colout \
        '\''(^.+  running)|(^.+suspended)|(^.+not running)'\'' \
        green,yellow,red
7 голосов
/ 29 июня 2009

Я использую rcg из "Linux Server Hacks", О'Рейли. Он идеально подходит для того, что вы хотите, и может выделять несколько выражений, каждое из которых имеет разные цвета.

#!/usr/bin/perl -w
#
#       regexp coloured glasses - from Linux Server Hacks from O'Reilly
#
#       eg .rcg "fatal" "BOLD . YELLOW . ON_WHITE"  /var/adm/messages
#
use strict;
use Term::ANSIColor qw(:constants);

my %target = ( );

while (my $arg = shift) {
        my $clr = shift;

        if (($arg =~ /^-/) | !$clr) {
                print "Usage: rcg [regex] [color] [regex] [color] ...\n";
                exit(2);
        }

        #
        # Ugly, lazy, pathetic hack here. [Unquote]
        #
        $target{$arg} = eval($clr);

}

my $rst = RESET;

while(<>) {
        foreach my $x (keys(%target)) {
                s/($x)/$target{$x}$1$rst/g;
        }
        print
}
5 голосов
/ 13 марта 2015

Я добавил это к своим .bash_aliases:

highlight() {
  grep --color -E "$1|\$"
}
2 голосов
/ 20 февраля 2019

Опция -z для grep также довольно приятна!

cat file1 | grep -z "pattern"
2 голосов
/ 07 апреля 2017

Чтобы выделить шаблоны при просмотре всего файла, h может сделать это.

Плюс он использует разные цвета для разных узоров.

cat FILE | h 'PAT1' 'PAT2' ...

Вы также можете передать вывод от h до less -R для лучшего чтения.

Чтобы получить grep и использовать 1 цвет для каждого рисунка, cxpgrep может подойти.

...