Скажем, у меня есть следующий файл:
$ cat test
test line 1
test line 2
line without the search word
another line without it
test line 3 with two test words
test line 4
По умолчанию grep
возвращает каждую строку, содержащую поисковый запрос:
$ grep test test
test line 1
test line 2
test line 3 with two test words
test line 4
Передача --color
параметра в grep
заставит его выделить часть строки, которая соответствует поисковому выражению, но он все равно будет возвращать только те строки, которые содержат выражение. Есть ли способ получить grep
для вывода каждую строку в исходном файле, но выделить совпадения?
Мой текущий ужасный взлом для достижения этой цели (по крайней мере, для файлов, которые не имеют более 10000 последовательных строк без совпадений):
$ grep -B 9999 -A 9999 test test
Если grep
это невозможно, есть ли другой инструмент командной строки, который предлагает такую же функциональность? Я возился с этим ack
, но у него, похоже, тоже нет выбора.
grep
highlighting
Майкл Mrozek
источник
источник
-C 9999
вместо.-A 9999 -B 9999
Я всегда делаю:grep -C 9999 pattern file
Ответы:
То, что мы здесь делаем, - это сопоставление с
$
шаблоном и тестовым шаблоном, очевидно$
, не нужно ничего окрашивать, поэтому только тестовый шаблон получает цвет.-E
Просто включается расширенным согласование регулярных выражений.Вы можете легко создать из него функцию, например так:
источник
highlight () { grep --color -E "$1|$" $2 ; }
. Использование:highlight test yourfile
"$2"
также должны быть указаны.highlight () { grep --color -E "$1|$" "$@" }
что позволяет файлы с пробелами в их именах и несколько файлов."$1"
в файлах. Использованиеhighlight () { grep --color -E "$1|$" "${@:1}" }
для Ubuntu и Debian используйте ack-grep вместо ack
источник
--regexp string
; эквивалент ack / ack-grep--match string
ack --passthru
с Perl:grep_passthrough () { ! perl -ne "print; \$e ||= /$@/; END{{exit \$e}}"; }
ack --passthru
также работает на потоках! Например,ifconfig | ack --passthru inet
Другой способ сделать это правильно и переносимо с
grep
(помимо использования двух регулярных выражений с чередованием , как в принятом ответе) осуществляется через нулевой шаблон (и , соответственно , пустая строка).Он должен работать одинаково хорошо как
-E
и-F
переключатели , так как, в соответствии со стандартом :а также
Так что это просто вопрос бега
и соответственно
источник
grep -F -e '' -e 'string'
.seq 3 | grep -F -e '' -e 2
выводит только 2 в 2.27 (и 2.26, но не 2.25 и не в git head). Только с-F
(не без или с -E). IOW, только 2.26 и 2.27, кажется, имеют ошибку и только с -F.seq 3 | grep -F -e '' -e '' -e 2
, кажется, работает также с 2.27-F
, избавляя от необходимости беспокоиться о том, что символы появляются вstring
. Вы можете упомянуть--color
; так как этот ответ всплывает на странице (при просмотре голосов), больше людей могут прочитать его раньше других ответов.У меня есть следующая функция, которую я использую для таких вещей:
Внутренне это выглядит некрасиво, приятно и просто в использовании, вот так:
или, для чуть более реального примера:
Вы можете изменить цвета на любой, какой вам нравится (что может быть сложно с grep - я не уверен), изменив значения
1
и31
и43
(после\e[
) на другие значения. Эти коды к применению все более месте , но вот краткое введение: 1 жирным шрифтом текст, то31
делает его красным, и43
дает желтый фон.32
или33
будут разные цвета,44
или или45
будут разные фоны: вы поняли. Вы даже можете заставить его мигать (с5
), если вы так склонны.Здесь не используются никакие специальные модули Perl, и Perl почти повсеместен, поэтому я ожидаю, что он будет работать где угодно. Решение grep очень умное, но переключатель --color на grep доступен не везде. Например, я только что попробовал это решение на компьютере Solaris, работающем под управлением bash, и на другом, работающем под управлением ksh, и на моей локальной машине Mac OS X, работающей под управлением zsh. Все работало просто отлично. Солярис поперхнулся
grep --color
решением, однако.Кроме того, ack - это круто, и я рекомендую его всем, кто его еще не обнаружил, но у меня были некоторые проблемы с его установкой на несколько из многих серверов, на которых я работаю. (Я забыл почему: я думаю, что это связано с модулями Perl.)
Поскольку я не думаю, что когда- либо работал над Unix-боксом, на котором не был установлен Perl (за исключением систем встроенного типа, маршрутизаторов Linksys и т. Д.), Я бы сказал, что это в значительной степени универсальное решение ,
источник
Вместо использования Grep вы можете использовать Less:
Искать как это:
/pattern
EnterЭто будет:
Чтобы перейти к следующей соответствующей строке:
n
Чтобы перейти к предыдущей строке соответствия:
N
Для переключения выделения: Esc
u
Также вы можете изменить цвет подсветки, если хотите.
источник
Ты можешь попробовать:
Однако не очень переносимый, и даже если Perl установлен, вам может понадобиться скачать другой модуль. Кроме того, он будет окрашивать всю строку, а не только поисковое слово.
источник
ripgrep
Используйте
ripgrep
с его--passthru
параметром:Это один из самых быстрых инструментов поиска , поскольку он построен на основе движка регулярных выражений Rust, который использует конечные автоматы, SIMD и агрессивные буквальные оптимизации, чтобы сделать поиск очень быстрым.
источник
Есть гораздо более простой способ сделать это для GNU grep, но я не думаю, что он переносимый (т. Е. BSD grep):
В трубе:
cat <file> | grep --color=always -z <query>
На файл:
grep --color=always -z <query> <file>
Кредит идет к ответу Кира здесь .
источник
--color
это тоже не стандартно .)Ни один из ответов, данных до сих пор, не является переносимым решением.
Вот портативная 1 функция оболочки я уже писал в закрытом как дублированный вопрос , который не требует нестандартных инструментов или нестандартных расширений , снабженные
perl
,ack
,ggrep
,gsed
,bash
и любит , но нужна только оболочка POSIX и POSIX обязательные утилитыsed
иprintf
:Вы можете использовать это так:
Цвет подсветки можно настроить, используя один из этих кодов в аргументе команды sed (32 м здесь зеленый):
1 Пока ваш терминал поддерживает escape-последовательности цветов ANSI.
источник
sed
Версия, работает на обоихbash
иash
.источник
ОП попросил
grep
, и это то, что я РЕКОМЕНДУЮ ; но после трудных попыток решить проблемуsed
, для протокола, вот простое решение:или же
Буду красить
main
в красный.\E[31m
: стартовая последовательность красного цвета\E[0m
: готовая цветовая маркировка&
: подобранный образец/g
: все слова в строке, а не только первые$'string'
интерпретируются строки bash с экранированными символамиЧто касается grep , он также работает с использованием
^
(начало строки) вместо$
(конец строки). Пример:И просто, чтобы показать этот сумасшедший псевдоним, который я НЕ РЕКОМЕНДУЮ , вы можете даже позволить открыть цитаты:
все работает! :) Не беспокойтесь, если вы забудете закрыть кавычку, bash запомнит вас с помощью символа продолжения строки.
источник