grep - список имен файлов, где найдено совпадение


31

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

cat *.html | grep 75447A831E943724DD2DE9959E72EE31

Возвращает только содержимое HTML-страницы, где найдено совпадение, но оно не сообщает мне файл, в котором оно было найдено. Как я могу получить grep, чтобы показать мне имя файла, где найдено мое совпадение?


Предоставленное предложение действительно не работает .... Все, что я получаю, это "стандартный ввод" cat * .html | grep -i -H 1ee024007823cc0bfbefba98ba1e1f4c (стандартный ввод): <html> <head> <title>
BeMy Friend

4
Вы упускаете суть. Вам не нужно использовать кошку. Кошка не дает grep различать отдельные файлы.
Муру

Возможно, вам пригодится этот пост переполнения стека .
Пабло А

Ответы:


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 Friend

и это только если я дам ключ -H. Если я делаю только то, что перечислил в OP, тогда он не предоставляет никакого имени файла.
BeMy Friend

3
@BeMyFriend, проблема cat. catозначает объединить. Если вы объедините все файлы вместе, прежде чем передать их grep, grepпосмотрите только один большой стандартный входной файл и не сможете (если не считать гадания) вернуть вам информацию об отдельных файлах. Видеть?. Сайрус, как насчет объяснения этого в ответе?
Rmano

ОК, проблема в команде cat, но что может быть решением?
Йозеф Климук

21

Я использую это все время, чтобы искать файлы, содержащие строку, рекурсивно в каталоге (это означает, что обход любой подпункт подпапки) grep -Ril "yoursearchtermhere"

  • R это искать рекурсивно (по символическим ссылкам)
  • i это сделать его без учета регистра
  • l это просто список имен файлов.

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


macOS всегда требует файл def, может быть это подстановочный знак. В противном случае он предполагает ввод от stdin( grep: warning: рекурсивный поиск 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

Ответ, опубликованный Сайрусом, абсолютно правильный, и это Правильный путь ТМ, чтобы сделать это, 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.