Grep mostrando o nome do arquivo e a string encontrada

3

Eu preciso de um comando egrep que liste todos os nomes de arquivos que contenham as palavras + que string ele encontrou. Vamos imaginar este cenário:

Palavras que preciso encontrar: apple , watermelon e banana .

O que eu preciso: desejo listar todos os arquivos que contiverem qualquer um deles (não é necessário ter todos eles no mesmo arquivo) e imprimir a palavra encontrada no arquivo. Exemplo de um resultado de pesquisa que quero:

./file1.txt:apple
./file1.txt:banana
./file2.txt:watermelon
./file5.txt:apple

Lembro-me de ver um comando grep que mostra FILENAME:STRING nos resultados da pesquisa, mas não me lembro como isso foi feito. Eu tentei:

egrep -lr 'apple|banana|watermelon' .

Mas os resultados da pesquisa mostraram:

./file1.txt
./file2.txt

Ok, isso ajuda, mas ... em file1 , qual das palavras que encontrou? Esse é o problema que estou enfrentando.

    
por sanjuro8998 01.07.2015 / 21:20

4 respostas

3

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 se instruções 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 idéia básica encontra /regular expression/ e executa o código nas chaves após ele, se encontrado (que é imprimir FILENAME e qual string encontramos).

    
por Sergiy Kolodyazhnyy 01.07.2015 / 21:31
14

Você usou -l , que é o oposto do que você deseja. De man 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' .

(O -E diz grep para agir como egrep .)

    
por muru 01.07.2015 / 21:27
3

Aqui está o comando que você está procurando:

grep -R "apple\|banana\|watermelon" <search_path>

O -R lerá todos os arquivos sob cada diretório em search_path , recursivamente. O nome do arquivo será exibido para cada partida.

    
por el_tigro 01.07.2015 / 21:45
2

A seguir, você verá a saída desejada (usando o bash):

for x in apple banana watermelon ; do grep $x * ; done

A saída fornecerá todas as linhas contendo a string de pesquisa.

O texto a seguir fornecerá apenas a string de pesquisa como saída:

for x in apple banana watermelon ; do grep -l $x * |xargs -I{} echo {}:$x; done
    
por NZD 02.07.2015 / 04:30

Tags