Я пытаюсь найти файлы, содержащие определенное слово, используя grep
. В каталоге много файлов (> 500)
Команда я бегу
$ grep 'delete' *
Вывод
validate_data_stage1:0
validate_data_stage2:0
validate_data_stage3:0
validate_data_stage4:0
validate_data_stage5:0
validate_input_stage1:0
validate_input_stage2:0
validate_input_stage3:0
validate_input_stage4:0
.... and hundred of such lines
Это файлы, которые не содержат данное совпадение. Я хочу, чтобы эти строки не отображались в stdout. Я знаю о -q
переключателе, но это подавило бы полный вывод, который я не хочу.
Как я могу это сделать?
grep
search
stdout
command-switch
холодный морской тропический воздух
источник
источник
grep
не следует распечатывать имена файлов несоответствующих файлов. На самом деле, похоже, чтоgrep
строка с контентом0
совпадает. Можете ли вы опубликовать точный шаблон поиска, который вы используете?grep 'delete' * -R
, но я не думаю, что-R
это вызывает какие-либо проблемы. И да, обычно он не печатает несоответствующие, но не уверен, что здесь происходит ...grep -- 'delete' *
(добавил--
), и это сработало, как ожидалось. Удаление--
ведет к приведенному выше дисплею.-ci
. Спасибо за решение проблемы. Вы можете опубликовать этот сценарий в качестве ответа.Ответы:
Это поведение демонстрируется
grep -c
.Возможно, у вас есть файл, имя которого начинается с символа
-
и содержитc
символ, и вы используете GNU grep без установкиPOSIXLY_CORRECT
переменной окружения.Использование:
или лучше:
--
помечает конец опций так, что это имя файла не будет рассматриваться как опция (с помощью grep POSIX это не будет, так какdelete
аргумент без опции пометил бы конец опций), но это не решило бы проблему файл называется-
. Онgrep delete ./*
более надежен, но имеет недостаток, заключающийся в выводе дополнительного./
для соответствующих файлов (хотя это может считаться бонусом, поскольку помогает идентифицировать имена файлов, содержащие символы новой строки).источник
Добавить
Не очень элегантно, но, думаю, сработает.
Добавление
-l
к вашей команде даст вам только совпадения, но также будет подавлять печать количества совпадений для каждого файла.источник
-l
работал. Обход тоже хорош. Спасибоgrep -v ':0$'
такой, чтобы сопоставлялись только те, которые находятся в конце строки (однакоgrep -l
подход намного лучше, если вам не нужно количество строк)При использовании
grep -l
вы получите только те файлы, которые содержат хотя бы одно совпадение.Вам нужна информация о том, сколько совпадений в файле? Потому что вы можете пропустить, используя
-c
который используется для подсчета количества совпадений в файле.edit: И, как сказал чернокнижник, использование
-I
для подавления совпадений в двоичных файлах также может быть хорошей идеей.источник
Как получить ненулевые значения:
grep -rIcH 'string' . | grep -v ':0$'
-r
Рекурсировать подкаталоги.-I
Игнорировать двоичные файлы (спасибо @tongpu , чернокнижник) .-c
Показать количество совпадений. Раздражает, включает в себя файлы 0-count.-H
Показать имя файла, даже если только один файл.'string'
ваша строка идет сюда..
Начать с текущего каталога.| -v ':0$'
Удалить 0-отсчет файлов. (спасибо @LaurentiuRoescu )(Я понимаю, что OP непреднамеренно считал -c, но здесь приземляется google (grep ненулевой счет).)
источник
Как и в ответе Лоренцию, вы также можете использовать листинг в
-l
качестве входных данных для файла grep:grep -r "pattern" -c $(grep -rl "pattern")
он позволяет сохранить раскраску grep, но делает то же самое в фоновом режиме.
источник