Подтвердить что ты не робот

"grep" смещение строки ascii из двоичного файла

Я создаю двоичные файлы данных, которые представляют собой просто ряд записей, объединенных вместе. Каждая запись состоит из (двоичного) заголовка, за которым следуют двоичные данные. В двоичном заголовке строка ascii содержит 80 символов. Где-то в пути мой процесс написания файлов немного перепутался, и я пытаюсь отладить эту проблему, проверяя, как долго каждая запись на самом деле.

Это кажется чрезвычайно связанным, но я не понимаю perl, поэтому я не смог получить принятый ответ на работу. Другой ответ указывает на bgrep, который я скомпилировал, но он хочет, чтобы я подал ему шестнадцатеричную строку, и я бы предпочел просто иметь инструмент, где я могу дать ему строку ascii, и он найдет его в двоичных данных, напечатайте строку и смещение байта, где она была найдена.

Другими словами, я ищу инструмент, который действует следующим образом:

tool foobar filename

или

tool foobar < filename

и его вывод выглядит примерно так:

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

например. строка, которая соответствует и смещение байта в файле, где началось совпадение. В этом примере я могу сделать вывод, что каждая запись имеет длину 400 байтов.

Другие ограничения:

  • Возможность поиска по regex классная, но мне не нужна эта проблема.
  • Мои двоичные файлы большие (3.5Gb), поэтому я хотел бы, если возможно, не читать весь файл в памяти.
4b9b3361

Ответ 1

Вы можете использовать strings для этого:

strings -a -t x filename | grep foobar

Протестировано с GNU binutils.

Например, где в /bin/ls происходит --help:

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

Вывод:

14938 Try `%s --help' for more information.
162f0       --help     display this help and exit

Ответ 2

grep --byte-offset --only-matching --text foobar filename

Опция --byte-offset печатает смещение каждой соответствующей строки.

Параметр --only-matching делает это смещение печати для каждого соответствующего экземпляра вместо каждой соответствующей строки.

Параметр --text делает grep обрабатывать двоичный файл как текстовый файл.

Вы можете сократить его до:

grep -oba foobar filename

Он работает в версии GNU grep, которая поставляется с Linux по умолчанию. Он не будет работать в BSD grep (который поставляется с Mac по умолчанию).

Ответ 3

Я хотел выполнить ту же задачу. Хотя строки | grep работал, я обнаружил, что gsar был тем инструментом, который мне нужен.

http://tjaberg.com/

Результат выглядит следующим образом:

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