Para o seu exemplo específico, você pode fazer isso:
find . -type f -name "*.txt" -exec grep FirstKeyWord {} \; | grep "SecondKeyWord"
BTW, isso também pode ser feito sem usar um segundo grep. Em vez disso, use egrep
com as duas alternativas de FirstKeyWord
seguido por SecondKeyWord
ou SecondKeyWord
seguido por FirstKeyWord
:
find . -type f -name "*.txt" -exec egrep "FirstKeyWord.*SecondKeyWord|SecondKeyWord.*FirstKeyWord" {} \;
Se você puder fazer algumas garantias sobre os nomes de caminho resultantes do find
(como nenhum espaço principal ou interno e nenhuma nova linha nos nomes de caminho), você também pode fazer desta forma:
find . -type f -name "*.txt" -print | while read filename; do grep "FirstKeyWord" "${filename}" | grep "SecondKeyWord"; done
A resposta mais geral é "você não pode" diretamente de find
. Comandos de tubulação ou usando &&
ou ||
são uma função do shell, não uma função da execução de processos.
Eu já usei esse padrão antes, mas ele é frágil e mais complexo:
find . -type f -name "*.txt" -print \
| sed -e 's;[\$"'!];\&;g' \
-e 's;^.*$;grep "FirstKeyWord" "&" | grep "SecondKeyWord";' \
| sh
Imprima cada nome de arquivo, use sed
para transformá-lo em um shell script (tomando cuidado para escapar dos caracteres no nome do arquivo que podem causar problemas quando colocado entre aspas duplas) e execute o resultado o shell.
A outra solução é criar um script de shell que faça o seu processamento e chame esse script de shell a partir do find:
$ cat grepit.sh
#!/bin/sh
grep "FirstKeyWord" "$1" | grep "SecondKeyWord"
$ find . -type f -name "*.txt" -exec sh grepit.sh {} \;