Grep mostrando o nome do arquivo e a string encontrada

Grep mostrando o nome do arquivo e a string encontrada

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, watermelone 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 grepcomando que aparece FILENAME:STRINGnos 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 -Einstruções greppara 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

informação relacionada