Pregunta ¿Cómo hago grep a través de archivos binarios que parecen texto?


Tengo archivos binarios que deberían ser de texto (son registros exportados), pero no puedo abrirlos con menos (parece feo, parece un archivo binario). Descubrí que podía abrirlo con vi y que puedo controlarlo (verás los registros reales), pero lo que realmente me gustaría hacer es grep a través de ellos (sin tener que abrir cada uno con vi y luego ejecutar) una búsqueda). ¿Hay alguna manera de hacer eso?


76
2017-11-05 15:03


origen


serverfault.com/questions/51477/… - quanta
Has probado grep -a? - quanta
stackoverflow.com/questions/9988379/… - Ciro Santilli 新疆改造中心 六四事件 法轮功


Respuestas:


Puedes usar grep De todos modos, para buscar en el archivo, no importa si el archivo de entrada es realmente texto o no. De 'man grep':

    -a, --text
          Process a binary file as if it were text; this is equivalent to the --binary-files=text option.

   --binary-files=TYPE
          If  the  first few bytes of a file indicate that the file contains binary data, assume that the file is
          of type TYPE.  By default, TYPE is binary, and grep normally outputs either a one-line  message  saying
          that a binary file matches, or no message if there is no match.  If TYPE is without-match, grep assumes
          that a binary file does not match; this is equivalent  to  the  -I  option.   If  TYPE  is  text,  grep
          processes  a  binary  file  as  if  it  were  text; this is equivalent to the -a option.  Warning: grep
          --binary-files=text might output binary garbage, which can have nasty side effects if the output  is  a
          terminal and if the terminal driver interprets some of it as commands.

Por favor, marque las palabras de advertencia al final del segundo párrafo. Es posible que desee redirigir los resultados de grep a un nuevo archivo y examinar esto con vi / less.


85
2017-11-05 15:48



grep realmente no funciona. prueba grep en un dispositivo de almacenamiento. se quedará sin memoria. tiene un mecanismo de búfer interno roto que depende de líneas de longitud razonable. - user239558


Pasarlo por strings, que eliminará todo el código binario dejando solo el texto.


41
2017-11-05 15:09



Gran idea, gracias :) [no OP] - Karel Bílek
strings Al parecer no entiende utf-8 es texto. - Javier


Dar bgrep un intento. (lanzamiento original / tenedor más reciente)


6
2017-11-05 16:07



Creo que esta es la mejor respuesta aquí. Es tan molesto ver malas implementaciones de búsqueda binaria como aquí commandlinefu.com/commands/matching/grep-binary/… donde el escape por \x Realmente no funciona como aquí grep -P "\x05\x00\xc0" mybinaryfile. - Léo Léopold Hertz 준영
Corro bgrep "fafafafa" test_27.6.2015.bin |less pero consigue test_27.6.2015.bin: 00005ee4. Yo asumiría que conseguir fafafafa, ya que estaba buscando esto. No hay manual en el hombre. ¿Alguna idea de por qué tal salida? - Léo Léopold Hertz 준영
Abrí un nuevo hilo sobre el funcionamiento de bgrep aquí stackoverflow.com/q/31135561/54964 - Léo Léopold Hertz 준영
cual es la diferencia grep -a? - rubo77
Desafortunadamente, bash: bgrep: command not found... y No package bgrep available. - jww


Puedes usar estos tres comandos:

  1. grep -a <sth> file.txt

  2. cat -v file.txt | grep <sth>

  3. cat file.txt | tr '[\000-\011\013-\037\177-\377]' '.' | grep <sth>


5
2018-06-17 10:43



El tr no parece funcionar en mi caja solaris 10. Prueba simple: echo -e 'x \ ty' | tr '[\ 000- \ 011 \ 013- \ 037 \ 177- \ 377]' '.' No traduce la pestaña. - user55570


A partir de Grep 2.21, los archivos binarios son tratado de manera diferente:

Al buscar datos binarios, grep ahora puede tratar los bytes que no son de texto como una línea   terminadores Esto puede aumentar significativamente el rendimiento.

Entonces, lo que sucede ahora es que con datos binarios, todos los bytes que no son de texto (incluidas las nuevas líneas) se tratan como terminadores de línea. Si quieres cambiar esto comportamiento, usted puede:

  • utilizar --text. Esto asegurará que solo las nuevas líneas sean terminadores de línea.

  • utilizar --null-data. Esto asegurará que solo los bytes nulos sean terminadores de línea


1
2017-07-18 00:19