Окрашенный grep — просмотр всего файла с подсвеченными совпадениями
Я нахожу флаг --color=always
утилиты grep
чрезвычайно полезным. Однако grep
выводит только строки с совпадениями (если не запрашивать контекстные строки). Поскольку каждая напечатанная строка содержит совпадение, подсветка не добавляет столько возможностей, сколько могла бы.
Мне бы очень хотелось использовать cat
, чтобы просмотреть весь файл с подсвеченными совпадениями шаблона.
Существует ли способ заставить grep
выводить каждую строку, которая считывается, независимо от того, есть ли совпадение? Я понимаю, что можно написать скрипт, который будет запускать grep
на каждой строке файла, но мне было интересно, возможно ли это сделать с помощью стандартного grep
?
5 ответ(ов)
Вот несколько способов сделать это:
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
Вот что-то в том же духе. Скорее всего, вам понадобится использовать less меньше, так что попробуйте это:
less -p pattern file
Эта команда выделит заданный шаблон и прыгнет к первому его вхождению в файле.
Вы можете перейти к следующему вхождению с помощью n
, а к предыдущему - с помощью p
. Чтобы выйти, нажмите q
.
Вы также можете создать псевдоним. Добавьте эту функцию в ваш файл .bashrc
(или .bash_profile
на macOS):
function grepe {
grep --color -E "$1|$" $2
}
Теперь вы можете использовать псевдоним следующим образом: "ifconfig | grepe inet
" или "grepe css index.html
".
(PS: не забудьте выполнить source ~/.bashrc
, чтобы перезагрузить настройки bash в текущей сессии)
Опция -z
для grep
действительно очень удобна!
cat file1 | grep --color -z "pattern"
Вот документация по опции -z
:
-z
,--null-data
Обрабатывает входные и выходные данные как последовательности строк, каждая из которых завершается нулевым байтом (ASCII NUL,
\0
), вместо символа новой строки. Как и опция-Z
или--null
, эту опцию можно использовать с командами типаsort -z
для обработки произвольных имен файлов.
Эта опция особенно полезна, когда вы имеете дело с данными, содержащими символы новой строки, и хотите избежать их некорректной обработки.
Вы можете использовать программу 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
Таким образом, вы можете легко визуализировать разные статусы или ошибки в ваших логах с помощью цветного выделения.
Bash инструмент для получения n-й строки из файла
Как использовать 'grep' для непрерывного потока?
Как выводить команды оболочки по мере их выполнения
Как узнать, в какой интерактивной оболочке я нахожусь (командная строка)
Расширение переменных внутри одинарных кавычек в команде Bash