grep як придушити показ невідповідного файлу?


12

Я намагаюся знайти файли, що містять певне слово, використовуючи 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 ./*

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


13

Додайте

| grep -v ':0$'

Не дуже елегантно, але я думаю, що зробимо роботу.

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


1
-lпрацювали. обробка також хороша. Дякую
mtk

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

9

Використовуючи, grep -lви отримаєте лише ті файли, які містять принаймні одне збіг.

Вам потрібна інформація про те, скільки збігів у файлі взагалі є? Тому що ви можете пропустити за допомогою -cякого використовується для підрахунку кількості збігів у файлі.

редагувати: І як казав Веллок, використання -Iпридушення збігів у двійкових файлах також може бути хорошою ідеєю.


0

Як визначити підрахунок нуля:

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

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

(Я розумію, що ОП ненавмисно рахував -c, але google (греп ненульовий підрахунок) приземляється тут.)


0

Подібно до відповіді Лаурентіу, ви також можете використовувати список -lяк вхідних файлів для grep:
grep -r "pattern" -c $(grep -rl "pattern")
Це дозволяє зберігати grep забарвлення, але робить те ж саме у фоновому режимі


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