7

Окрашенный grep — просмотр всего файла с подсвеченными совпадениями

33

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

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

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

5 ответ(ов)

10

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

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

Символ | является оператором ИЛИ. Вы можете либо экранировать его с помощью \, либо указать grep, что текст для поиска должен интерпретироваться как регулярное выражение, добавив флаг -E или используя команду egrep вместо grep.

Текст для поиска "pattern|$" — это своего рода уловка, которая будет совпадать с строками, содержащими pattern, ИЛИ с строками, которые заканчиваются. Поскольку все строки имеют конец, они все будут совпадать, но конец строки на самом деле не состоит из каких-либо символов, поэтому он не будет выделен цветом.

Чтобы также передавать окрашенные части через пайпы, например, к less, добавьте параметр always к --color:

grep --color=always 'pattern\|$' file | less -r
grep --color=always -E 'pattern|$' file | less -r
egrep --color=always 'pattern|$' file | less -r
1

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

less -p pattern file

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

Вы можете перейти к следующему вхождению с помощью n, а к предыдущему - с помощью p. Чтобы выйти, нажмите q.

0

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

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

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

(PS: не забудьте выполнить source ~/.bashrc, чтобы перезагрузить настройки bash в текущей сессии)

0

Опция -z для grep действительно очень удобна!

cat file1 | grep --color -z "pattern"

Вот документация по опции -z:

-z, --null-data

Обрабатывает входные и выходные данные как последовательности строк, каждая из которых завершается нулевым байтом (ASCII NUL, \0), вместо символа новой строки. Как и опция -Z или --null, эту опцию можно использовать с командами типа sort -z для обработки произвольных имен файлов.

Эта опция особенно полезна, когда вы имеете дело с данными, содержащими символы новой строки, и хотите избежать их некорректной обработки.

0

Вы можете использовать программу colout для добавления цветных акцентов в текстовый поток. Она позволяет выделять совпадения с заданным регулярным выражением определенным цветом (например, "красным"). Пример использования:

# Чтобы просмотреть файл журнала и выделить в красном все вхождения 'ERROR'
colout ERROR red <logfile

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

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

Таким образом, вы можете легко визуализировать разные статусы или ошибки в ваших логах с помощью цветного выделения.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь