Si ejecuto grep foo bar.txt
, grep resalta cada aparición de "foo" en bar.txt
. Pero a veces quiero usarlo find
para determinar qué archivos busca grep. Entonces hago algo como esto:
find . -iname "*.abc" | xargs grep foo
O esto:
find . -iname "*.abc" -exec grep foo {} \;
En ambos casos, grep encuentra correctamente las apariciones de "foo" en los archivos especificados, pero el resultado no tiene ningún resaltado.
¿Cómo puedo seguir usando find
para elegir archivos para que grep busque sin perder el resaltado?
Estoy ejecutando Gnome Terminal 3.4.1.1 en Ubuntu 12.04, con bash como mi shell.
Respuesta1
En ambos comandos, el problema es que no es grep
sino otro comando el que genera la salida real ( xargs
y find
, respectivamente).
Puedes resolver esto llamando directamente grep
a cada nombre de archivo:
IFS=$'\n'
for FILE in $(find . -iname "*.abc"); do
grep foo $FILE
done
unset IFS
O como una sola línea:
IFS=$'\n';for FILE in $(find . -iname "*.abc");do grep foo $FILE;done;unset IFS
Cómo funciona:
IFS=$'\n'
establece el separador de campo interno en el carácter de nueva línea (o los espacios en los nombres de archivos causarán problemas).for FILE in $(COMMAND); do COMMANDS done
recorre los archivos especificados porCOMMAND
, establece la variableFILE
en el archivo actual y ejecutaCOMMANDS
.grep foo $FILE
busca yfoo
envía$FILE
los resultadosdirectamentea la pantalla.unset IFS
restablece el separador de campo interno a su valor predeterminado (no es necesario en un script).
Respuesta2
Solo grep
tu salida nuevamente para colorearla.
Hice algo similar aquí:Obtenga datos adicionales sobre la coincidencia de grep