it-swarm.com.ru

Colorized grep - просмотр всего файла с выделенными совпадениями

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

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

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

430
zslayton

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

grep --color -E 'pattern|$' file
grep --color 'pattern\|$' file
egrep --color 'pattern|$' file
700
Ryan Oberoi

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

less -p pattern file

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

79
Dennis Williamson

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

 $ ack --color --passthru --pager = "$ {PAGER: -less -R}" файлы шаблонов 
 $ ack --color --passthru файлы шаблонов | меньше -R 
 $ export ACK_PAGER_COLOR = "$ {PAGER: -less -R}" 
 $ ack - файлы шаблонов .passthru 

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

46
ephemient

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

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

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

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

18
Fabien Sa

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

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

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

Screen shot from Github project

15
kepkin

Используйте программу 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
12
user2683246

Я использую 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
}
7

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

highlight() {
  grep --color -E "$1|\$"
}
5
uronce

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

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

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

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

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

2
treulz

Параметр -z для grep также довольно приятный!

cat file1 | grep -z "pattern"
1
Abhishek Jaisingh

еще один грязный путь:

grep -A80 -B80 --color FIND_THIS IN_FILE

Я сделал

alias grepa='grep -A80 -B80 --color'

в башрч.

1
fly_a320

Хорошо, это один из способов,

wc -l filename

даст вам количество строк - скажем, NN, то вы можете сделать

grep -C NN --color=always filename
1
nik

Вот скрипт Shell, который использует функцию gwub от Awk, чтобы заменить искомый текст правильной escape-последовательностью, чтобы он отображался ярко-красным:

#! /bin/bash
awk -vstr=$1 'BEGIN{repltext=sprintf("%c[1;31;40m&%c[0m", 0x1B,0x1B);}{gsub(str,repltext); print}' $2

Используйте это так:

$ ./cgrep pattern [file]

К сожалению, он не обладает всеми функциями grep.

Для получения дополнительной информации вы можете обратиться к статье " Так вам нравится цвет " в Linux Journal

1
Wernsey

В другом ответе упоминался ключ -Cn от grep, включающий n строк контекста. Иногда я делаю это с n = 99 как быстрый и грязный способ получить [по крайней мере] скриншот из контекста, когда шаблон egrep кажется слишком неудобным, или когда я на машине, на которой я не установил rcg и/или ccze.

Недавно я обнаружил ccze, который является более мощным колоризатором. Моя единственная жалоба заключается в том, что она ориентирована на экран (например, less, которую я никогда не использую по этой причине), если вы не укажете ключ -A для вывода «raw ANSI».

+1 для rcg упомянутых выше. Это все еще мой фаворит, так как его так легко настроить под псевдонимом. Примерно так обычно есть в моем ~/.bashrc:

псевдоним tailc = 'tail -f/my/app/log/file | rcg отправить "BOLD GREEN" получить ошибку "CYAN" "RED" '

1
MarkHu

Я использую следующую команду для аналогичной цели:

grep -C 100 searchtext file 

Это скажет grep, чтобы напечатать 100 * 2 строки контекста, до и после выделенного поискового текста. 

0
Al Mamun

Если вы хотите выделить несколько рисунков разными цветами, посмотрите скрипт this bash.

Основное использование:

echo warn error debug info 10 nil | colog

Вы можете изменить шаблоны и цвета во время работы, нажав одну клавишу, а затем введите клавишу.

0
Edoot

В качестве альтернативы вы можете использовать Серебряный Искатель и сделать

ag <search> --passthrough
0
Andrew Magee