Frage Wie grepe ich binäre Dateien, die wie Text aussehen?


Ich habe Binärdateien, die Text sein sollten (sie sind exportierte Protokolle), aber ich kann es nicht mit weniger öffnen (es sieht hässlich aus - es sieht wie eine Binärdatei aus). Ich fand, dass ich es mit vi öffnen konnte und ich kann es cat (Sie werden die tatsächlichen Protokolle sehen), aber was ich wirklich gerne tun würde, ist sie zu durchforsten (ohne jedes mit vi zu öffnen und dann durchzuführen eine Suche). Gibt es eine Möglichkeit für mich, das zu tun?


76
2017-11-05 15:03


Ursprung


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


Antworten:


Sie können verwenden grep trotzdem, um die Datei zu durchsuchen - es ist nicht wirklich wichtig, ob die Eingabedatei wirklich Text ist oder nicht. Von '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 Warnhinweise am Ende des zweiten Absatzes. Vielleicht möchten Sie die Ergebnisse von grep in eine neue Datei umleiten und diese mit vi / less untersuchen.


85
2017-11-05 15:48



Grep funktioniert nicht wirklich. Probieren Sie Grep auf einem Speichergerät aus. Es wird nicht mehr genügend Arbeitsspeicher zur Verfügung stehen. Es hat einen defekten internen Puffermechanismus, der von Linien angemessener Länge abhängt. - user239558


Führe es durch strings, die den gesamten binären Code ausblendet und nur den Text zurücklässt.


41
2017-11-05 15:09



Tolle Idee, danke :) [nicht OP] - Karel Bílek
strings anscheinend nicht verstehen utf-8 ist text. - Javier


Geben bgrep ein Versuch. (Originalversion / neuere Gabel)


6
2017-11-05 16:07



Ich denke, das ist die beste Antwort hier. Es ist so nervig, schlechte Implementierungen der binären Suche wie hier zu sehen commandlinefu.com/commands/matching/grep-binary/... wo die Flucht vorbei \x funktioniert nicht so wie hier grep -P "\x05\x00\xc0" mybinaryfile. - Léo Léopold Hertz 준영
ich renne bgrep "fafafafa" test_27.6.2015.bin |less aber geh test_27.6.2015.bin: 00005ee4. Ich würde annehmen, dass es geht fafafaweil ich das gesucht habe. Keine Anleitung im Mann. Irgendeine Idee warum eine solche Ausgabe? - Léo Léopold Hertz 준영
Ich habe hier einen neuen Thread über die Funktionsweise von bgrep geöffnet stackoverflow.com/q/31135561/54964 - Léo Léopold Hertz 준영
Worin besteht der Unterschied? grep -a? - rubo77
Unglücklicherweise, bash: bgrep: command not found... und No package bgrep available. - jww


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>


5
2018-06-17 10:43



der tr scheint auf meiner solaris 10 box nicht zu funktionieren. Einfacher Test: echo -e 'x \ ty' | tr '[\ 000- \ 011 \ 013- \ 037 \ 177- \ 377]' '. übersetzt den Tab nicht. - user55570


Beginnend mit Grep 2.21 sind Binärdateien unterschiedlich behandelt:

Bei der Suche nach Binärdaten kann grep jetzt Nicht-Text-Bytes als Zeile behandeln   Terminatoren. Dies kann die Leistung erheblich steigern.

Was nun passiert ist, dass mit binären Daten alle Nicht-Text-Bytes sind (einschließlich Zeilenumbrüche) werden als Zeilenabschluss behandelt. Wenn Sie das ändern wollen Verhalten, können Sie:

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

  • benutzen --null-data. Dadurch wird sichergestellt, dass nur Nullbytes Leitungsabschlusszeichen sind


1
2017-07-18 00:19