Wie kann ich Binärdateien durchsuchen, die wie Text aussehen?

76

Ich habe Binärdateien, die Text sein sollten (es handelt sich um exportierte Protokolle), aber ich kann sie nicht mit weniger öffnen (es sieht hässlich aus - es sieht aus wie eine Binärdatei). Ich habe festgestellt, dass ich es mit vi öffnen kann und ich kann es katzen (Sie werden die tatsächlichen Protokolle sehen), aber ich würde wirklich gerne durch sie blättern (ohne jedes einzelne mit vi öffnen und dann ausführen zu müssen) eine Suche). Gibt es eine Möglichkeit für mich, das zu tun?

Robyn Smith
quelle
11
Hast du es versucht grep -a?
Quanten

Antworten:

85

Sie können grepdie Datei trotzdem durchsuchen - es ist egal, ob es sich bei der Eingabedatei wirklich um Text handelt oder nicht. Aus '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.

Bitte markieren Sie die vorsichtigen Worte am Ende des zweiten Absatzes. Vielleicht möchten Sie die Ergebnisse von grep in eine neue Datei umleiten und diese mit vi / less untersuchen.

Axel Knauf
quelle
grep funktioniert nicht wirklich. versuche grep auf einem Speichergerät. Es wird kein Speicher mehr vorhanden sein. Es hat einen defekten internen Puffermechanismus, der von Leitungen mit angemessener Länge abhängt.
user239558
41

Pipe it through strings, wodurch der gesamte Binärcode entfernt wird und nur der Text übrig bleibt.

Mike Scott
quelle
stringsanscheinend versteht utf-8 nicht ist text.
Javier
6

Probieren Sie bgrepes aus. ( Originalversion / neuere Version )

Quanten
quelle
Ich denke das ist die beste Antwort hier. Es ist so ärgerlich schlechte Implementierungen von binärer Suche , um zu sehen , wie hier commandlinefu.com/commands/matching/grep-binary/... , wo die Flucht durch \xwie hier nicht wirklich funktionieren grep -P "\x05\x00\xc0" mybinaryfile.
Léo Léopold Hertz 준영
Ich laufe bgrep "fafafafa" test_27.6.2015.bin |lessaber bekomme test_27.6.2015.bin: 00005ee4 . Ich würde annehmen, fafafafa zu bekommen , da ich dies suchte. Kein Handbuch im Mann. Irgendeine Idee warum so eine Ausgabe?
Léo Léopold Hertz 준영
Ich habe hier einen neuen Thread über die Funktionsweise von bgrep eröffnet. Stackoverflow.com/q/31135561/54964
Léo Léopold Hertz 준영
Was ist der Unterschied zu grep -a?
Rubo77
Leider bash: bgrep: command not found...und No package bgrep available.
5

Sie können diese drei Befehle verwenden:

  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
quelle
die tr scheint auf meiner solaris 10 box nicht zu funktionieren. Einfacher Test: echo -e 'x \ ty' | tr '[000- \ 011 \ 013 \ 037 \ 177 \ 377]' '.' übersetzt die Registerkarte nicht.
user55570
1

Ab Grep 2.21 werden Binärdateien unterschiedlich behandelt :

Bei der Suche nach Binärdaten behandelt grep jetzt möglicherweise Nicht-Text-Bytes als Zeilenabschluss. Dies kann die Leistung erheblich steigern.

Was jetzt passiert, ist, dass bei binären Daten alle Nicht-Text-Bytes (einschließlich Zeilenumbrüchen) als Zeilenabschluss behandelt werden. Wenn Sie dieses Verhalten ändern möchten, können Sie:

  • verwenden --text. Dadurch wird sichergestellt, dass nur Zeilenumbrüche Zeilenabschlusszeichen sind

  • verwenden --null-data. Dadurch wird sichergestellt, dass nur Nullbytes als Zeilenabschluss verwendet werden

Steven Penny
quelle