Preciso de um comando egrep que liste todos os nomes de arquivos que contêm as palavras + qual string foi encontrada. Vamos imaginar este cenário:
Palavras que preciso encontrar: apple
, watermelon
e banana
.
O que eu preciso: quero listar todos os arquivos que contenham algum deles (não preciso ter todos no mesmo arquivo) e imprimir qual palavra encontrou no arquivo. Exemplo de resultado de pesquisa que desejo:
./file1.txt:apple
./file1.txt:banana
./file2.txt:watermelon
./file5.txt:apple
Lembro-me de ter visto um grep
comando que aparece FILENAME:STRING
nos resultados da pesquisa, mas não me lembro como foi feito. Tentei:
egrep -lr 'apple|banana|watermelon' .
Mas os resultados da pesquisa mostraram:
./file1.txt
./file2.txt
Ok, ajuda, mas... em file1
, qual das palavras encontrou? Esse é o problema que estou enfrentando.
Responder1
Você usou -l
, que é o oposto do que você deseja. Deman grep
:
-l, --files-with-matches
Suppress normal output; instead print the name of each input
file from which output would normally have been printed. The
scanning will stop on the first match. (-l is specified by
POSIX.)
O que você quer é -H
:
-H, --with-filename
Print the file name for each match. This is the default when
there is more than one file to search.
Mas esse é o padrão de qualquer maneira. Apenas faça:
grep -Er 'apple|banana|watermelon' .
(As -E
instruções grep
para agir como egrep
.)
Responder2
A maneira de fazer isso com o awk:
awk -v var1=apple -v var2=banana -v var3=watermelon '{ if($0~var1) {print FILENAME":"var1} ; if($0~var2) {print FILENAME":"var2} ; if($0~var3) {print FILENAME":"var3} }' *
Basicamente, declare 3 variáveis e 3 instruções if para imprimir o nome do arquivo e a variável correspondente que foi encontrada
EDITAR
Versão mais curta:
awk '/watermelon/{ print FILENAME":watermelon" }; /banana/{print FILENAME":banana"}; /apple/ {print FILENAME":apple"}' *
A ideia básica de encontrar /regular expression/
e executar o código entre chaves depois dele, se for encontrado (que é imprimir FILENAME e qual string encontramos).
Responder3
Aqui está o comando que você está procurando:
grep -R "apple\|banana\|watermelon" <search_path>
O -R lerá todos os arquivos em cada diretório emcaminho_pesquisa, recursivamente. O nome do arquivo será exibido para cada correspondência.
Responder4
O seguinte fornecerá a saída desejada (usando bash):
for x in apple banana watermelon ; do grep $x * ; done
A saída fornecerá todas as linhas que contêm a string de pesquisa.
O seguinte fornecerá apenas a string de pesquisa como saída:
for x in apple banana watermelon ; do grep -l $x * |xargs -I{} echo {}:$x; done