
В bash, если я хочу выполнить команду и отобразить только те строки вывода, которые соответствуют определенному шаблону, я могу передать ее по конвейеру grep
, например
файл testfile
hello
there
my
friends
команда
$ cat testfile | grep 'hello'
hello #this will be highlightd
это выделит совпадение поиска и отобразит всю строку, на которую оно попадает. Я могу использовать -A
и -B
для отображения строк до и после этой строки. Мой вопрос в том, возможно ли выполнить команду и отобразить весь вывод как обычно, но выделить совпадения поиска, как это делает grep? поэтому мой вывод будет
hello #highlighted
there
my
friends
решение1
Чтобы использовать Color GREP только для выделения совпавших шаблонов, но не для изменения вывода:
grep --color=always -e "^" -e "hello" testfile
Первый шаблон будет соответствовать всем строкам (все строки будут напечатаны), второй шаблон (и любые последующие шаблоны) приведут к тому, что совпадающий текст будет выделен цветом.
Поскольку первый шаблон соответствует всем строкам, но не соответствует печатному символу, он не добавляет никакого цветного выделения, поэтому он не ухудшает читаемость выделенного текста и не мешает ей.
решение2
Добавьте опцию -z
к вашей команде GNU grep:
cat testfile | grep --color=always -z 'hello'
или короче
grep --color=always -z 'hello' testfile
решение3
Это работает как с GNU grep, так и с grep на FreeBSD:
grep --color=always 'hello\|$'
Он соответствует тексту "hello" или ( \|
) непечатаемой нулевой строке в конце каждой строки ( $
). Вот почему печатается каждая строка, но выделяется только "hello".
Скорее всего, вы уже --color=auto
настроили в своей оболочке. Тогда вам, скорее всего, не нужно указывать --color=always
:
grep 'hello\|$'
Вы также можете использовать более простую версию, используя egrep
(с расширенными регулярными выражениями), где |
для выражения «или» не нужно экранировать:
egrep 'hello|$'
См. также аналогичный вопрос на StackOverflow:Цветной grep — просмотр всего файла с выделенными совпадениями
решение4
Вот решение с использованием ripgrep
— современной, более простой в использовании (на мой взгляд) и гораздо более быстрой замены grep
:
cat my-file | rg --passthru '<REGEX>'
Вы также можете легко настроить «цвет маркера»:
# dark red foreground with light yellow background:
cat my-file | rg --passthru --colors match:fg:124 --colors match:bg:229 '<REGEX>'
Видеть man rg
(онлайн версия).
Для повседневного использования я создал псевдоним оболочки:
# in .bashrc
alias hl='rg --passthru --colors match:fg:124 --colors match:bg:229'
Теперь это так же просто cat my-file | hl '<REGEX>'
.