executando múltiplos greps em um único comando find

5

Eu quero usar o comando find para encontrar alguns arquivos contendo vários padrões ao mesmo tempo.

Eu tentei algo assim:

find . -name "*.xml" -exec grep -iH keyword1 + && grep -iH "keyword2" {} \;

Mas o comando acima não funciona.

É possível fazer isso no bash?

    
por Boolean 27.08.2011 / 20:49

3 respostas

8

Pelo que entendi, você deseja listar arquivos que contenham ambos "keyword1" e "keyword2". Para fazer isso, você pode usar dois testes -exec da seguinte maneira:

find . -name "*.xml" -exec grep -iq keyword1 {} \; -exec grep -iH keyword2 {} \;

Isso executará o segundo grep condicionalmente - se o primeiro retornar verdadeiro. A opção -q impede a saída do primeiro grep , pois listaria todos os arquivos que incluem apenas "keyword1".

Como a opção -H exibe a linha correspondente junto com o nome do arquivo, é provável que você queira usar -l . Então

find . -name "*.xml" -exec grep -iq keyword1 {} \; -exec grep -il keyword2 {} \;

Isso produzirá resultados semelhantes aos sugeridos por Caleb, mas sem a necessidade de -print adicional.

    
por 27.08.2011 / 22:53
5

Primeiro, para fazer isso, ache que você adicionaria um segundo argumento -exec . Cada argumento só é capaz de executar um comando. Se você precisasse executar várias coisas, você teria que usar um hack tornando o comando um shell e executando vários comandos. Aqui está com find fazendo o trabalho:

find . -name "*.xml" -exec grep -qi "keyword1" {} \; -exec grep -qi "keyword2" {} \; -print

Note que usei a opção -print para gerar os nomes dos arquivos em vez de fazer o grep e usei a opção -q do grep para colocá-lo no modo silencioso para que ele simplesmente fornecesse um código de retorno usado por find para dizer se o resultado foi verdadeiro ou não, então siga em frente. Se chegar ao último passo (o que significa que ambos os arquivos coincidiram), imprime a saída.

No entanto, isso é ineficiente porque o grep está realmente tendo que verificar todos os arquivos duas vezes. Se você quis dizer sua pergunta literalmente, isso terá que ser feito, mas se você quisesse encontrar arquivos contendo QUALQUER uma das strings, você pode usar o grep para procurar por ambos os padrões em um passo como este:

find . -name "*.xml" -exec grep -qi -e "keyword1" -e "keyword2" {} \; -print

Editar: Não está claro na sua pergunta exatamente o que você quer que aconteça, e os dois exemplos que dei realmente fazem coisas diferentes. A primeira é uma operação AND e apenas imprime arquivos que contenham ambas as palavras-chave e a segunda é uma operação OR que imprime o nome do arquivo se ele contiver uma das cadeias. Escolha seu veneno.

    
por 27.08.2011 / 20:56
0

Ou apenas use egrep:

find . -name "*.xml" -exec egrep -iH "keyword1|keyword2" {} \;

    
por 27.08.2011 / 22:00

Tags