Grep muestra el nombre del archivo y la cadena encontrada

Grep muestra el nombre del archivo y la cadena encontrada

Necesito un comando egrep que enumere todos los nombres de archivos que contienen las palabras + qué cadena ha encontrado. Imaginemos este escenario:

Palabras que necesito encontrar apple: watermelony banana.

Lo que necesito: quiero enumerar todos los archivos que contienen alguno de ellos (no es necesario tenerlos todos en el mismo archivo) e imprimir qué palabra encontró en el archivo. Ejemplo de resultado de búsqueda que quiero:

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

Recuerdo haber visto un grepcomando que aparece FILENAME:STRINGen los resultados de la búsqueda, pero no recuerdo cómo se hizo. Lo intenté:

egrep -lr 'apple|banana|watermelon' .

Pero los resultados de la búsqueda mostraron:

./file1.txt
./file2.txt

Ok, ayuda pero... ¿en file1cuál de las palabras encontró? Ese es el problema al que me enfrento.

Respuesta1

Usaste -l, que es lo opuesto a lo que quieres. 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.)

Lo que quieres es -H:

-H, --with-filename
      Print the file name for each match.  This is  the  default  when
      there is more than one file to search.

Pero ese es el valor predeterminado de todos modos. Solo haz:

grep -Er 'apple|banana|watermelon' .

(El -Ele dice grepque actúe como egrep...)

Respuesta2

La forma de hacerlo con 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}  }' *

Básicamente, declare 3 variables y 3 declaraciones if para imprimir el nombre del archivo y la variable correspondiente que se ha encontrado.

EDITAR

Versión más corta:

awk '/watermelon/{ print FILENAME":watermelon" }; /banana/{print FILENAME":banana"}; /apple/ {print FILENAME":apple"}' *

La idea básica es buscar /regular expression/y ejecutar el código entre llaves después de él, si se encuentra (que es imprimir FILENAME y qué cadena encontramos).

Respuesta3

Aquí está el comando que estás buscando:

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

El -R leerá todos los archivos en cada directorio enruta_búsqueda, recursivamente. El nombre del archivo se mostrará para cada partido.

Respuesta4

Lo siguiente le dará el resultado que desea (usando bash):

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

El resultado le proporcionará todas las líneas que contienen la cadena de búsqueda.

Lo siguiente le dará solo la cadena de búsqueda como resultado:

for x in apple banana watermelon ; do grep -l $x * |xargs -I{} echo {}:$x; done

información relacionada