¿Por qué grep no ignora los archivos binarios por defecto?

94

La página de manual de grepdescribe la -Ibandera de la siguiente manera:

-I      Ignore binary files.  This option is equivalent to 
        --binary-file=without-match option.

También dice esto sobre archivos binarios:

 --binary-files=value Controls searching and printing of binary files.
         Options are binary, the default: search binary files but do not print
         them; without-match: do not search binary files; and text: treat all
         files as text.

No puedo pensar en un escenario en el que me importarían las coincidencias en archivos binarios. Si existe tal escenario, seguramente debe ser la excepción y no la norma. ¿Por qué no grepignora los archivos binarios de forma predeterminada en lugar de requerir que se configure este indicador para hacerlo?

Braiam
fuente
44
Puede configurar la variable GREP_OPTIONSa su configuración preferida, luego no tiene que usar tantos modificadores de línea de comando.
Marco
2
Una nota para otros comandos que no admiten dicha variable: puede establecer opciones predeterminadas definiendo un alias en su .(ba|z|foo)shrc': alias grep = "grep -I" `.
Erik
1
Esto realmente puede ser muy útil. Por ejemplo, estaba buscando la versión de la unidad de un proyecto, y no podía recordar en qué archivo estaba guardado. Busqué el formato de la versión, y apareció algunos archivos binarios que coinciden. Resultó que era anterior a la versión 5, la versión solo estaba presente en un archivo binario, por lo que sin la coincidencia binaria, podría haberlo perdido.
Svend Hansen
FYI Hay una herramienta reconocida que es "mejor que grep". Ack no busca archivos binarios. En Debian, viene bajo el nombre de "ack-grep".
teika kazura

Respuestas:

91

No todo lo que grep piensa es un archivo binario, en realidad es un archivo binario. por ejemplo, los registros de las marionetas tienen codificación de colores ansi, lo que hace que grep piense que son binarios. Todavía me gustaría buscarlos si estoy buscando a través de / var / log.

Dennis Kaarsemaker
fuente
44
Lo mismo ocurre con los archivos PDF también.
Joseph R.
12
+ históricamente grep NO podría hacer eso, por lo que solo por compatibilidad, el valor predeterminado debe ser todo incluido.
Olivier Dulac
2
@OlivierDulac tiene sentido, de lo contrario, ignorar los archivos binarios debería ser el valor predeterminado.
Dagang
5

grepLa capacidad de buscar archivos binarios también es útil cuando estoy compilando un programa y el enlazador ( ld) se queja de que no se encuentra alguna función. Puedo usar un comando como

grep function_name / lib / lib *

para encontrar la biblioteca que lo contiene. (Las bibliotecas son archivos binarios).

Daniel Frużyński
fuente
En ese caso, preferiría usar grep -l function_name /lib/lib*o nm -Do /lib/lib* | grep function_nameo ldconfig -p | grep -o '/.*/lib.*' | xargs nm -Do | grep function_nameaunque.
Stéphane Chazelas
Bueno, grep some_function /lib/*es más corto y generalmente da la respuesta correcta: nombre de la biblioteca que estoy buscando. Pero sí, a veces también se requiere un enfoque más sofisticado como el suyo.
Daniel Frużyński