Como grep nomes de arquivos, que contêm simultaneamente algumas palavras

0

Eu fiz o seguinte:

for i in ~/files/*; do cat $i | grep -e word1 -e word2; done

A saída foi: todos os valores, que contêm word1 e ao lado dele - todos os arquivos, que contêm word2. Não só o que contém os dois. E eu também queria nomes de arquivos, não apenas valores.

    
por Josef Klimuk 16.11.2017 / 15:33

2 respostas

3

Em geral, você pode usar a opção grep de -H para "[p] obter o nome do arquivo para cada correspondência".

Isso encontrará linhas que contêm word1 ou word2 :

grep -HE "word1|word2" ~/files/* 2>/dev/null

Se você quiser encontrar linhas com word1 e word2 , faça:

grep -HE "word1.*word2|word2.*word1" ~/files/* 2>/dev/null

O envio de stderr para um esquecimento escuro com 2>/dev/null impede que grep envie mensagens de erro inúteis, por ex. se um dos arquivos correspondentes for um diretório.

    
por dessert 16.11.2017 / 15:43
2

grep normalmente imprime linhas correspondentes a qualquer dos padrões fornecidos. Para imprimir linhas correspondentes a múltiplos padrões, canalize a saída de um grep para outro:

grep word1 | grep word2

Para muitos arquivos:

grep word1 ~/files/* | grep word2

Não há necessidade de um loop ou cat .

Isso pode não funcionar corretamente para arquivos cujos nomes contenham word2 . Nesse caso, combine os padrões manualmente em um único grep:

grep -e 'word1.*word2' -e 'word2.*word1' ~/files/*

Quando vários arquivos são fornecidos para grep , ele imprime o nome do arquivo por padrão. Para forçar isso para um único nome de arquivo, use -H :

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

Se você receber um erro sobre a lista de argumentos ser muito longa e o diretório não contiver subdiretórios, eu ainda direi grep para recurse:

grep -R -e 'word1.*word2' -e 'word2.*word1' ~/files
    
por muru 16.11.2017 / 15:42