¿Cómo busco archivos binarios que parecen texto?

76

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

Robyn Smith
fuente
11
¿Lo intentaste grep -a?
cuantos
1
stackoverflow.com/questions/9988379/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

85

Puede utilizar de greptodos modos para buscar en el archivo; realmente no le 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.

Marque las palabras de precaución 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.

Axel Knauf
fuente
grep realmente no funciona. intente grep en un dispositivo de almacenamiento. se quedará sin memoria. tiene un mecanismo de almacenamiento interno roto que depende de líneas de longitud razonable.
user239558
41

Conéctelo strings, lo que eliminará todo el código binario dejando solo el texto.

Mike Scott
fuente
stringsaparentemente no entiende utf-8 es texto.
Javier
6

Darle bgrepuna oportunidad. ( lanzamiento original / bifurcación más reciente )

quanta
fuente
Creo que esta es la mejor respuesta aquí. Es muy molesto ver malas implementaciones de búsqueda binaria como aquí commandlinefu.com/commands/matching/grep-binary/… donde el escape \xno funciona realmente como aquí grep -P "\x05\x00\xc0" mybinaryfile.
Léo Léopold Hertz 준영
Corro bgrep "fafafafa" test_27.6.2015.bin |lesspero obtengo test_27.6.2015.bin: 00005ee4 . Asumiría obtener 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 준영
¿cuál es la diferencia con respecto a grep -a?
rubo77
Lamentablemente, bash: bgrep: command not found...y No package bgrep available.
5

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>

MLSC
fuente
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
1

A partir de Grep 2.21, los archivos binarios se tratan de manera diferente :

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

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

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

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

Steven Penny
fuente