grep - список файлу списку, де знайдено збіг


31

У мене в каталозі є маса файлів .html. Я хочу переглянути кожен файл і відповідати шаблону (MD5). Все це досить просто. Проблема в тому, що мені потрібно знати, в якому файлі знайдено збіг.

cat *.html | grep 75447A831E943724DD2DE9959E72EE31

Повертає вміст сторінки HTML лише там, де знайдено збіг, але він не повідомляє мені файл, у якому він був знайдений. Як я можу отримати греп, щоб показати мені ім'я файлу, де знайдено моє збіг?


Надана пропозиція дійсно не працює .... Все, що я отримую, - це "стандартний ввід" cat * .html | grep -i -H 1ee024007823cc0bfbefba98ba1e1f4c (стандартний вхід): <html> <head> <title>
BeMy Friend

4
ви пропускаєте суть. Вам не потрібно використовувати кішку. Кіт не дозволяє грепу розрізнити окремі файли.
муру

Можливо, вам буде корисна ця публікація про переповнення стека .
Пабло

Відповіді:


32
grep -H 75447A831E943724DD2DE9959E72EE31 *.html

-H, --with-filename
              Print the file name for each match. This is
              the default when there is more than one file
              to search.

3
Як мовиться, це типовий параметр для декількох файлів, тому поки існує більше одного html-файлу, -Hце не потрібно.
муру

1
Вибачте, моє питання було образливим. Я повинен був сказати, що я над цим працював деякий час, і я використав декілька перемикачів І прочитав сторінку MAN, де сказано, що вона зазначає ім'я файлу за замовчуванням .... Але те, що я отримую, це (стандартний ввід ), де слід вказати ім’я файлу.
Друг BeMy

і це лише в тому випадку, якщо я даю перемикач -H. Якщо я виконую лише те, що я вказав в ОП, то воно не містить жодного імені файлу.
Друг BeMy

3
@BeMyFriend, проблема в тому cat. catозначає з'єднати. Якщо ви з'єднаєте всі файли, перемикаючи їх перед тим, як передавати їх grep, grepперегляньте лише один великий стандартний вхідний файл і не можете (за умови здійснення ворожіння) повернути будь-яку інформацію про окремі файли. Побачити?. Сайрус, а як пояснити це у відповіді?
Рмано

Гаразд, проблема в команді cat, але що може бути вирішенням?
Йозеф Климук

20

Я використовую цей весь час, щоб шукати файли, що містять рядок, ВІДПОВІДНО в каталозі (це означає, що проходьте будь-яку підпапку sub sub grep -Ril "yoursearchtermhere"

  • R полягає в пошуку рекурсивно (за наступними посиланнями)
  • i це зробити його нечутливим до справи
  • l полягає лише в тому, щоб перелічити назву файлів.

тож відповідь на ваше запитання grep -l '75447A831E943724DD2DE9959E72EE31' *.htmlзробить, але ви можете просто grep -Ril '75447A831E943724DD2DE9959E72EE31'шукати цей рядок, нечутливий до регістру, у будь-якому файлі будь-якої папки


macOS вимагає файлу def завжди, це може бути символом підстановки. В іншому випадку він передбачає введення з stdin( grep: попередження: рекурсивний пошук stdin , що б не означало рекурсивне введення stdin :-). Іншими словами:grep -Ril 'texttofind' *
Віль

grep -RiH 'pattern'показує назву файлів та відповідний рядок
Ikrom


2
grep -r -H 75447A831E943724DD2DE9959E72EE31 *.html | awk -F : ' { print $1 } '

Альтернатива

grep -r -l 75447A831E943724DD2DE9959E72EE31 *.html

Виконання вище буде рекурсивно здійснювати пошук у папці та вкладених папках та друкувати шлях до файлу ...


grep -r -l - це єдине, що мені працювало.
Йозеф Климук

0

Відповідь, опублікована Сайрус, абсолютно правильна, і це правильний шлях TM, щоб це зробити, grepякщо нам потрібно лише знайти файли . Коли назви файлів потребують додаткового розбору або операцій зі збіганими іменами, ми можемо вдатися до використання whileциклу з ifоператором. Ось приклад, коли список імен походить від дуже часто використовуваної find+ whileструктури для безпечного розбору імен файлів.

find -type f -name "*.html" -print0 | while IFS= read -r -d '' filename
do
    if grep -q 'PATTERN' "$filename"
    then
        printf "%s found in %s\n" 'PATTERN' "$filename"
        # Here we can insert another command or function
        # to perform other operations on the filename
    fi
done

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