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

344

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

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

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

  • 0
    если вы хотите использовать более одного цвета для более чем одного шаблона (например, сообщения об ошибках, предупреждения, информация и т. д.), используйте sed . Решение sed дает вам несколько цветов за счет дополнительной сложности (вместо 30 символов у вас есть около 60 символов).
Теги:
grep
colors

15 ответов

561
Лучший ответ

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

grep --color -E 'pattern|$' file
grep --color 'pattern\|$' file
egrep --color 'pattern|$' file
  • 136
    Это хитрый трюк! Хорошо, я должен помнить это. Для тех из вас, кто не разбирается в регулярных выражениях, «pattern | $» будет соответствовать строкам, которые имеют шаблон, который вы ищете, и строкам AND, имеющим конец, то есть всем. Поскольку конец строки - это не какие-либо символы, цветная часть вывода будет просто вашим шаблоном. Спасибо Райан!
  • 47
    Вы также можете опустить "$": egrep --color "pattern|" file (credit stackoverflow.com/a/7398092/50979 )
Показать ещё 17 комментариев
54

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

less -p pattern file

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

  • 3
    Также работает с трубопроводом (чтение из stding) используя - : … | less -p pattern -
  • 3
    @phk: Вы даже можете опустить тире.
Показать ещё 2 комментария
37

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

  • 1
    Однако время от времени он не находит то, что я хочу, когда я уверен, что это должно быть там. ack умный, но иногда слишком умный, и он исключает тип файла, в котором было попадание.
  • 4
    @MPi ack -a будет искать все типы файлов, но исключая .git/ .svn/ и т. Д.
Показать ещё 2 комментария
13

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

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

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

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

  • 0
    Вы также можете использовать просто использовать egrep, если он доступен в вашей системе.
  • 1
    Конвейер результата этого меньше теряет информацию о цвете. Как вы могли бы предотвратить это?
Показать ещё 3 комментария
12

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

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

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

Изображение 3894

  • 3
    Вопрос прямо задан для решения с использованием grep , который является стандартной утилитой на машинах под управлением * nix.
  • 4
    из 12 ответов здесь я думаю, что только 5 использовали grep
Показать ещё 4 комментария
8

Используйте 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
  • 1
    Как отмечалось в другом месте, этот вопрос явно задавался для решения с использованием grep, который является стандартной утилитой на машинах, работающих под управлением * nix.
  • 3
    @ Зак, извини. На самом деле, если вы расширили проблему за пределы grep , и она уже colout в ответах, colout - это лучшее решение для вашей проблемы, лучшее, что я знаю. В соответствии с философией UNIX, программы должны быть написаны, чтобы хорошо выполнять одну вещь. Для grep это фильтрация текстового потока. Для colout это colout или выделение текстового потока.
Показать ещё 1 комментарий
5

Я использую 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
}
  • 5
    Ваше форматирование облажалось, приятель. (Я бы исправил это сам, но из-за самодовольной и элитарной системы репутации Stack Overflow мне это запрещено.)
  • 1
    Просто исправил форматирование.
1

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

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

Еще один ответ упоминал 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" '

1

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

wc -l filename

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

grep -C NN --color=always filename
  • 2
    «-C 2147483647», если вы не хотите сначала wc. Использование большого числа не замедляет процесс.
1

Вот оболочка 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

0

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

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

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

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

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

  • 0
    до сих пор для моего мерзавца Bash в Windows H работал хорошо. это просто и легко! Большое спасибо!!
0

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

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

echo warn error debug info 10 nil | colog

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

0

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

ag <search> --passthrough
0

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

grep -A80 -B80 --color FIND_THIS IN_FILE

Я сделал

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

в bashrc.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню