
Estou tentando escrever um script (digamos script1.sh) que encontre as linhas que contêm as palavras que forneço, em arquivos que estão em um determinado diretório e seus subdiretórios e apenas aqueles que estão nos arquivos com determinado arquivo extensão. Portanto, ./script1.sh python py this.is.what.i.look.for
deve dar resultados como estes:
python/abc/file1.py:11: this.is.what.i.look.for and the line can contain other things as well
python/file2.py:412: this.is.what.i.look.for this.toggleButton.getElement())
Tentei usar grep -r para pesquisar nos subdiretórios e consegui encontrar as linhas.
grep -r -e $3 $1
me fornece as linhas, mas não consegue eliminar outros arquivos com extensões diferentes e não consegui encontrar uma maneira de incluir $2 no código. Também não consegui colocar os números das linhas no meio. Tentei dividir a saída em 2 partes assim: python/abc/file1.py:
this.is.what.i.look.for and the line can contain other things as well
with awk -F " " '{print $1}
mas não consegui juntá-las novamente. Eu queria atribuir as partes da saída da função grep em variáveis e depois juntá-las novamente, mas também falhei nisso. t1="grep -r -e $3 $1 | awk -F " " '{print $1}'"
Tentei usar " ", ' ' ,$() para atribuir valores, pois não sabia qual usar, mas nenhum deles funcionou.
Responder1
Pelo menos com GNU grep
, você pode usar --include
(e --exclude
) para restringir as correspondências em um grep recursivo, usando uma expressão glob no estilo shell:
grep -r --include='*.py' -e pattern dir
Você pode adicionar -n
ou --line-number
adicionar a numeração. Finalmente, lembre-se de citar os parâmetros posicionais - então
grep -nr --include="*.$2" -e "$3" "$1"