grep - lista o nome do arquivo onde a correspondência é encontrada

31

Eu tenho um monte de arquivos .html em um diretório. Quero examinar cada arquivo e corresponder a um padrão (MD5). Tudo isso é fácil o suficiente. O problema é que preciso saber em qual arquivo a correspondência foi encontrada.

cat *.html | grep 75447A831E943724DD2DE9959E72EE31

Retorna apenas o conteúdo da página HTML onde a correspondência foi encontrada, mas não informa o arquivo em que foi encontrada. Como posso o grep me mostrar o nome do arquivo em que minha correspondência é encontrada?

Seja meu amigo
fonte
A sugestão fornecida realmente não funciona ... Tudo o que recebo é "entrada padrão" cat * .html | grep -i -H 1ee024007823cc0bfbefba98ba1e1f4c (entrada padrão): <html> <head> <title>
BeMy Friend
4
você está perdendo o objetivo. Você não precisa usar gato. O gato impede o grep de distinguir arquivos individuais.
19715 muru
Você pode achar útil esta postagem sobre estouro de pilha .
Pablo #

Respostas:

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.
Cyrus
fonte
3
Como se costuma dizer, esse é o padrão para vários arquivos, desde que haja mais de um arquivo html, -Hnão seja necessário.
19715 muru
1
Desculpe, minha pergunta foi ofensiva. Eu deveria ter dito que estou trabalhando nisso há um tempo e usei várias opções E li a página MAN, onde diz que ela lista o nome do arquivo por padrão .... Mas o que recebo é (entrada padrão ) onde deve listar o nome do arquivo.
BeMy Friend
e isso é apenas se eu der a opção -H. Se eu fizer apenas o que listei no OP, ele não fornecerá nenhum nome de arquivo.
BeMy Friend
3
@BeMyFriend, o problema é cat. catsignifica concatenar. Se você concatenar todos os arquivos juntos antes de passá-los grep, grepveja apenas um grande arquivo de entrada padrão e não poderá (além de adivinhar) devolver qualquer informação sobre os arquivos únicos. Vejo?. Cyrus, que tal explicar isso na resposta?
Rmano 19/02
OK, o problema é o comando cat, mas o que pode ser uma solução?
Josef Klimuk
20

Eu uso esse o tempo todo para procurar arquivos que contenham uma string, RECURSIVELY em um diretório (que significa atravessar qualquer subpasta subpasta) grep -Ril "yoursearchtermhere"

  • R é pesquisar recursivamente (seguindo links simbólicos)
  • i é torná-lo insensível
  • l é apenas para listar o nome dos arquivos.

portanto, responder à sua pergunta grep -l '75447A831E943724DD2DE9959E72EE31' *.htmlserve, mas você pode simplesmente grep -Ril '75447A831E943724DD2DE9959E72EE31'procurar essa sequência, sem distinção entre maiúsculas e minúsculas, em qualquer arquivo em qualquer subpasta

thebugfinder
fonte
O macOS exige sempre uma definição de arquivo, seja um curinga. Caso contrário, ele assume a entrada de stdin( grep: warning: pesquisa recursiva de stdin , qualquer que seja a entrada recursiva de stdin significaria :-). Em outras palavras:grep -Ril 'texttofind' *
Ville
grep -RiH 'pattern'nome de arquivos mostra e combinados linha
Ikrom
7

Você pode tentar isso

grep -rl '75447A831E943724DD2DE9959E72EE31' * > found.txt
Aura Vermelha
fonte
2
grep -r -H 75447A831E943724DD2DE9959E72EE31 *.html | awk -F : ' { print $1 } '

Alternativa para

grep -r -l 75447A831E943724DD2DE9959E72EE31 *.html

O procedimento acima irá procurar recursivamente na pasta e nas subpastas e imprimir o caminho do arquivo ...

Desenhou
fonte
grep -r -l é a única coisa que funcionou para mim.
Josef Klimuk
0

A resposta postada por Cyrus é absolutamente adequada e é The Right Way TM , grepse precisarmos apenas encontrar arquivos . Quando os nomes de arquivos precisam de análise ou operações adicionais nos nomes de arquivos correspondentes, podemos recorrer ao uso de whileloop com ifinstrução. Aqui está um exemplo em que a lista de nomes de arquivos vem da estrutura find+ usada com mais frequência whilepara análise segura de nomes de arquivos.

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
Sergiy Kolodyazhnyy
fonte
1
Relacionado: Procurar recursivamente um padrão / texto apenas no nome do arquivo especificado de um diretório? , especialmente a resposta de muru demonstrando grepa --includebandeira de.
Eliah Kagan