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


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

cat *.html | grep 75447A831E943724DD2DE9959E72EE31

Retorna somente o conteúdo da página HTML onde a correspondência é encontrada, mas não me diz qual arquivo foi encontrado. Como posso obter o grep para mostrar o nome do arquivo onde a minha correspondência é encontrada?


16
2018-02-19 06:07


origem


A sugestão fornecida realmente não funciona .... Tudo o que eu recebo é 'entrada padrão' cat * .html | grep -i -H 1ee024007823cc0bfbefba98ba1e1f4c (entrada padrão): <html> <head> <title> - BeMy Friend
você está perdendo o ponto. Você não precisa usar gato. O gato impede que o grep distinga arquivos individuais. - muru
Você pode achar útil este estouro de pilha postar. - Pablo Bianchi


Respostas:


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.

22
2018-02-19 06:09



Como diz, esse é o padrão para vários arquivos, desde que haja mais de um arquivo html, -H não é necessário. - muru
Desculpe, minha pergunta foi ofensiva. Eu deveria ter dito que tenho trabalhado nisso por um tempo e eu usei um número de opções E li a página MAN onde está escrito que lista o nome do arquivo por padrão ... Mas o que eu recebo é (entrada padrão ) onde deve listar o nome do arquivo. - BeMy Friend
e isso é só se eu der o interruptor -H. Se eu fizer apenas o que listei no OP, ele não fornecerá nenhum nome de arquivo. - BeMy Friend
@BeMyFriend, o problema é cat. cat significa concatenar. Se você concatenar todos os arquivos juntos antes passando-os para grep, grep ver apenas um arquivo de entrada padrão grande e não pode (curto de fazer adivinhação) lhe dar de volta qualquer informação sobre os arquivos individuais. Vejo?. Cyrus, que tal explicar isso na resposta? - Rmano
OK, o problema é o comando do gato, mas o que pode ser uma solução? - Josef Klimuk


Eu uso este o tempo todo para procurar por arquivos contendo uma string, RECURSIVELY em um diretório (ou seja, percorrendo qualquer sub sub pasta) grep -Ril "yoursearchtermhere"

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

então respondendo sua pergunta grep -l '75447A831E943724DD2DE9959E72EE31' *.html vai fazer mas você pode apenas fazer grep -Ril '75447A831E943724DD2DE9959E72EE31' para procurar essa cadeia, insensível a maiúsculas e minúsculas, em qualquer arquivo em qualquer subpasta


10
2018-02-19 07:36



O macOS requer um arquivo def sempre, pode ser um curinga. Caso contrário, assume a entrada de stdin(grep: warning: busca recursiva de stdin, qualquer entrada stdin recursiva significaria :-). Em outras palavras: grep -Ril 'texttofind' * - Ville


Você pode tentar isso

grep -rl '75447A831E943724DD2DE9959E72EE31' * > found.txt

6
2018-02-19 07:07





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

Alternativa para

grep -r -l 75447A831E943724DD2DE9959E72EE31 *.html

Fazer acima procurará recursivamente na pasta e subpastas e imprimirá o caminho do arquivo ...


1
2018-06-15 18:22



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


A resposta postada por Cyrus é absolutamente correta e é o jeito certoTM fazer isso com grep Se nós só precisa encontrar arquivos. Quando os nomes de arquivo precisam análise adicional ou operações nos nomes de arquivos correspondentes, podemos recorrer ao uso while laço com if declaração. Aqui está um exemplo em que lista de nomes de arquivos vem muito comumente usado find+while estrutura para 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

0
2018-06-15 19:31



Relacionado: Pesquise recursivamente um padrão / texto apenas no nome de arquivo especificado de um diretório?especialmente muru's answer demonstrando grep's --include bandeira. - Eliah Kagan