¿Cómo puedo conservar el resaltado de coincidencias de grep cuando canalizo find a grep?

¿Cómo puedo conservar el resaltado de coincidencias de grep cuando canalizo find a grep?

Si ejecuto grep foo bar.txt, grep resalta cada aparición de "foo" en bar.txt. Pero a veces quiero usarlo findpara 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 findpara 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 grepsino otro comando el que genera la salida real ( xargsy find, respectivamente).

Puedes resolver esto llamando directamente grepa 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 donerecorre los archivos especificados por COMMAND, establece la variable FILEen el archivo actual y ejecuta COMMANDS.

  • grep foo $FILEbusca y fooenvía $FILElos resultadosdirectamentea la pantalla.

  • unset IFSrestablece el separador de campo interno a su valor predeterminado (no es necesario en un script).

Respuesta2

Solo greptu salida nuevamente para colorearla.

Hice algo similar aquí:Obtenga datos adicionales sobre la coincidencia de grep

información relacionada