grep как подавить отображение несоответствующего файла?


11

Я пытаюсь найти файлы, содержащие определенное слово, используя 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переключателе, но это подавило бы полный вывод, который я не хочу.

Как я могу это сделать?


2
Как правило, grepне следует распечатывать имена файлов несоответствующих файлов. На самом деле, похоже, что grepстрока с контентом 0совпадает. Можете ли вы опубликовать точный шаблон поиска, который вы используете?
Адриан Хейне

Я использовал полный grep cmd grep 'delete' * -R, но я не думаю, что -Rэто вызывает какие-либо проблемы. И да, обычно он не печатает несоответствующие, но не уверен, что здесь происходит ...
MTK

@step @everyone .. Странно ... После просмотра отредактированного поста выше. Я попытался grep -- 'delete' *(добавил --), и это сработало, как ожидалось. Удаление --ведет к приведенному выше дисплею.
MTK

1
@ Stephane На самом деле вы правы. Я искал каталог ... и там был файл с именем -ci. Спасибо за решение проблемы. Вы можете опубликовать этот сценарий в качестве ответа.
MTK

Ответы:


9

Это поведение демонстрируется grep -c.

Возможно, у вас есть файл, имя которого начинается с символа -и содержит cсимвол, и вы используете GNU grep без установки POSIXLY_CORRECTпеременной окружения.

Использование:

grep -- delete *

или лучше:

grep delete ./*

--помечает конец опций так, что это имя файла не будет рассматриваться как опция (с помощью grep POSIX это не будет, так как deleteаргумент без опции пометил бы конец опций), но это не решило бы проблему файл называется -. Он grep delete ./*более надежен, но имеет недостаток, заключающийся в выводе дополнительного ./для соответствующих файлов (хотя это может считаться бонусом, поскольку помогает идентифицировать имена файлов, содержащие символы новой строки).


12

Добавить

| grep -v ':0$'

Не очень элегантно, но, думаю, сработает.

Добавление -lк вашей команде даст вам только совпадения, но также будет подавлять печать количества совпадений для каждого файла.


1
-lработал. Обход тоже хорош. Спасибо
MTK

4
строка grep должна быть grep -v ':0$'такой, чтобы сопоставлялись только те, которые находятся в конце строки (однако grep -lподход намного лучше, если вам не нужно количество строк)
mreithub

9

При использовании grep -lвы получите только те файлы, которые содержат хотя бы одно совпадение.

Вам нужна информация о том, сколько совпадений в файле? Потому что вы можете пропустить, используя -cкоторый используется для подсчета количества совпадений в файле.

edit: И, как сказал чернокнижник, использование -Iдля подавления совпадений в двоичных файлах также может быть хорошей идеей.


0

Как получить ненулевые значения:

grep -rIcH 'string' . | grep -v ':0$'

  • -r Рекурсировать подкаталоги.
  • -IИгнорировать двоичные файлы (спасибо @tongpu , чернокнижник) .
  • -cПоказать количество совпадений. Раздражает, включает в себя файлы 0-count.
  • -H Показать имя файла, даже если только один файл.
  • 'string' ваша строка идет сюда.
  • . Начать с текущего каталога.
  • | -v ':0$'Удалить 0-отсчет файлов. (спасибо @LaurentiuRoescu )

(Я понимаю, что OP непреднамеренно считал -c, но здесь приземляется google (grep ненулевой счет).)


0

Как и в ответе Лоренцию, вы также можете использовать листинг в -lкачестве входных данных для файла grep:
grep -r "pattern" -c $(grep -rl "pattern")
он позволяет сохранить раскраску grep, но делает то же самое в фоновом режиме.


обратите внимание, что имена файлов и каталогов, которые содержат любые пробелы или символы подстановки, будут по ошибке разделены и сопоставлены.
Джефф Шаллер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.