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
: watermelon
y 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 grep
comando que aparece FILENAME:STRING
en 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 file1
cuá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 -E
le dice grep
que 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