"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), поэтому я хотел бы, если возможно, не читать весь файл в памяти.
Ответы
Ответ 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