Você pode tentar o seguinte:
$ find . -type f -name "*.txt" -exec sh -c "grep -l "Reptile" {} | xargs -I% grep -Hn snake %" \;
./rep1.txt:2:snake
./rep2.txt:5:another snake
A saída contém listas delimitadas por dois pontos em que o primeiro argumento é o nome do arquivo (do argumento -H
para grep
), o segundo argumento é o número da linha na qual o termo desejado aparece (do -n
argumento para grep
), e o terceiro argumento é a própria linha.
O xargs
pode ser movido para fora do find
, fornecendo:
$ find . -type f -name "*.txt" -exec grep -l "Reptile" {} \; | xargs -i grep -Hn snake {}
Observe que o argumento -i
para xargs
(que é equivalente a -I{}
está obsoleto, mas eu o uso com frequência por conveniência.
Arquivos de entrada:
$ tail -n+1 rep*.txt
==> rep1.txt <==
Reptile
snake
iguana
crocodile
==> rep2.txt <==
Reptile
alligator
turtle
another snake
komodo dragon
==> rep3.txt <==
Reptile
lizard
gecko
Se você precisa lidar com nomes de arquivos malformados, pode pensar em incorporar print0
e a opção -0
em xargs.