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

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

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

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

Ответ 1

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

grep --color -E 'pattern|$' file
grep --color 'pattern\|$' file
egrep --color 'pattern|$' file

Ответ 2

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

less -p pattern file

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

Ответ 3

Я бы рекомендовал 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)) и имеет гораздо более приятный контекстный дисплей при поиске многих файлов.

Ответ 4

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

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

Теперь вы можете использовать псевдоним следующим образом: "ifconfig | grepe inet" или "grepe css index.html".

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

Ответ 5

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

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

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

Screen shot from Github project

Ответ 6

Используйте 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

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

#!/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
}

Ответ 8

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

wc -l filename

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

grep -C NN --color=always filename

Ответ 9

Вот оболочка script, которая использует функцию Awk gsub для замены текста, который вы ищете, с соответствующей 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

Ответ 10

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

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

+1 для упоминания rcg. Он по-прежнему мой любимый, так как он настолько прост в настройке в псевдониме. Что-то вроде этого обычно находится в моем ~/.bashrc:

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

Ответ 11

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

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

Ответ 12

другой грязный способ:

grep -A80 -B80 --color FIND_THIS IN_FILE

Я сделал

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

в bashrc.

Ответ 13

В качестве альтернативы вы можете использовать Silver Searcher и

ag <search> --passthrough

Ответ 14

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

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

echo warn error debug info 10 nil | colog

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

Ответ 15

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

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

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

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

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