it-swarm.com.de

"grep" Offset des ASCII-Strings aus der Binärdatei

Ich generiere binäre Dateien, die einfach eine Reihe von Datensätzen sind, die miteinander verkettet sind. Jeder Datensatz besteht aus einem (binären) Header gefolgt von binären Daten. Innerhalb des binären Headers befindet sich eine ASCII-Zeichenfolge mit 80 Zeichen. Irgendwann wurde mein Prozess, die Dateien zu schreiben, etwas durcheinander gebracht, und ich versuche, dieses Problem zu debuggen, indem ich prüfe, wie lange jeder Datensatz tatsächlich ist.

Das scheint extrem verwandt zu sein, aber ich verstehe Perl nicht, daher konnte ich die akzeptierte Antwort dort nicht zur Arbeit bringen. Die andere Antwort zeigt auf bgrep, das ich kompiliert habe, aber ich möchte, dass ich ihm eine Hex-Zeichenkette füge, und ich hätte lieber ein Werkzeug, mit dem ich die ASCII-Zeichenkette geben kann, und es wird sie in den Binärdaten finden Die Zeichenfolge und der Byte-Offset, wo er gefunden wurde.

Mit anderen Worten, ich suche nach einem Werkzeug, das sich so verhält:

tool foobar filename

oder

tool foobar < filename

und seine Ausgabe ist ungefähr so:

foobar:10
foobar:410
foobar:810
foobar:1210
...

z.B. der übereinstimmende String und ein Byte-Offset in der Datei, in der der Match begann. In diesem Fall kann ich davon ausgehen, dass jeder Datensatz 400 Byte lang ist.

Andere Einschränkungen:

  • die Fähigkeit, mit Regex zu suchen, ist cool, aber ich brauche es nicht für dieses Problem
  • Meine binären Dateien sind groß (3,5 GB), daher möchte ich möglichst nicht die gesamte Datei in den Speicher lesen.
23
mgilson

Sie können strings dafür verwenden:

strings -a -t x filename | grep foobar

Getestet mit GNU binutils.

Wo zum Beispiel in /bin/ls--help vorkommt:

strings -a -t x /bin/ls | grep -- --help

Ausgabe:

14938 Try `%s --help' for more information.
162f0       --help     display this help and exit
26
Thor
grep --byte-offset --only-matching --text foobar filename

Die Option --byte-offset druckt den Versatz jeder übereinstimmenden Zeile.

Mit der Option --only-matching wird der Offset für jede übereinstimmende Instanz anstatt für jede übereinstimmende Zeile gedruckt.

Mit der Option --text behandelt grep die Binärdatei als Textdatei.

Sie können es verkürzen auf:

grep -oba foobar filename

Es funktioniert in der GNU-Version von grep, die standardmäßig mit Linux geliefert wird. Es funktioniert nicht in BSD grep (das standardmäßig mit Mac geliefert wird).

27
Hari Menon

Ich wollte die gleiche Aufgabe machen. Obwohl Saiten | grep hat funktioniert, ich fand gsar genau das Werkzeug, das ich brauchte.

http://tjaberg.com/

Die Ausgabe sieht folgendermaßen aus:

>gsar.exe -bic -sfoobar filename.bin
filename.bin: 0x34b5: AAA foobar BBB
filename.bin: 0x56a0: foobar DDD
filename.bin: 2 matches found
0
caesun