Encontre todos os arquivos que contenham palavras-chave [duplicados]

1

Eu quero localizar todos os arquivos de texto em uma árvore de diretórios contendo duas palavras, word1 e word2 (por exemplo). Eu não posso apenas grep para word1 word2 , porque isso só encontrará ocorrências onde as duas palavras aparecem consecutivamente. Eu quero encontrar todos os arquivos que contenham ambos essas duas palavras, mas não necessariamente consecutivas.

Idealmente, a pesquisa deve imprimir nomes de arquivos, bem como o contexto em que os termos foram encontrados dentro dos arquivos. Isso seria muito útil. Uma GUI não faria mal.

Como posso fazer isso?

    
por becko 23.04.2018 / 20:16

4 respostas

1

Eu usaria o recurso find em que cada teste precisa passar para que o arquivo seja considerado uma correspondência. Encadeie dois comandos grep juntos para corresponder aos critérios:

find . -type f -exec grep -q word_one {} \; -exec grep -l word_two {} \;

Você pode ajustar os sinalizadores para o grep conforme necessário, incluindo citando as palavras se elas tiverem algum caractere especial especial ou regex (ou usando grep -F ).

    
por 23.04.2018 / 21:07
1

Como pesquisar arquivos onde existem duas palavras diferentes? tem muitas boas soluções para o seu problema básico. Para lidar com seu requisito adicional de mostrar o contexto, Precisamos apenas de uma dessas respostas (por exemplo, Stéphane’s ) e adicione um pouco a isso:

find . -type f -exec grep -q word1 {} ';' -exec grep -q word2 {} ';'  \
                                            -exec grep -A3 -B3 -E -H 'word1|word2' {} +

A parte find . -type f -exec grep -q word1 {} ';' -exec grep -q word2 {} ';' é apenas a segunda resposta de Stéphane (a portátil, mas simples) com a opção -l para o segundo grep (para listar nomes de arquivos) substituído por -q (para pesquisar e sair silenciosamente com status). Em seguida, adicionamos um grep final para exibir os resultados. -A3 e -B3 mostram três linhas depois e três linhas antes de cada partida; ajuste-os ao seu gosto. O -E é necessário para obter a expressão regular estendida word1|word2 para trabalhar sem \ ; o -H força grep a imprimir o nome do arquivo mesmo se houver apenas um arquivo.

    
por 24.04.2018 / 02:47
0

Você faria com grep :

grep -Elrz "word2(.|\n)*word1|word1(.|\n)*word2" .

Se você precisar de um conteúdo correspondente na saída, remova a opção l acima.

    
por 23.04.2018 / 21:10
-1

Meu primeiro pensamento seria procurar por arquivos que contenham word1 primeiro e, em seguida, pesquisar entre eles por arquivos que contenham word2 . Seria:

grep -l word1 -r . | xargs grep -l word2

Exemplo:

$ cat FILE
word1
$ cat FILE1
word2
$ cat FILE2
word1
word2
$ grep -l word1 -r . | xargs grep -l word2
FILE2

Testado com GNU e FreeBSD userland.

    
por 23.04.2018 / 20:26

Tags