Я использую grep/sed для анализа большого двоичного файла, заполненного нулями, для некоторых конкретных данных. Это в среде Windows, используя gnuwin32.

Предполагая, что у меня есть некоторые, чтобы вернуть некоторые данные из двоичного файла, который был похож на это (шестнадцатеричное представление):

42 9D E1 0A 01 FF FF FF FF FF FF FF 7F 00 FE FF FF 0A 01 E1 0A 01 C0 0B 00 4D 00
00 9C E1 0A 01 2C 41 38 B4 15 FB 49 00 4D 00 41 00 48 00 4F 00 53 00 54 00 31 00
32 00 33 00 2E 00 73 00 75 00 62 00 2E 00 64 00 6F 00 6D 00 61 00 69 00 6E 00 2E
00 73 00 74 00 61 00 2E 00 6F 00 72 00 67 00 2E 00 61 00 75

Но только в соответствии с этой частью выше:

49 00 4D 00 41 00 48 00 4F 00 53 00 54 00 31 00 32 00 33

Как именно я поступил бы, используя grep и / или sed? Наличие нулей делает некоторые плохие вещи для grep, тем более, что мне действительно нужно возвращать данные как часть автоматического анализатора файлов.

Приведенный ниже grep близок к выполнению того, что я хочу:

grep -Prino ".{0,100}I\000M\000A\000H\000O\000S\000T\0001\0002\0003.{0,100}" "d:\dhcp.mdb"

Однако он просто возвращает «Двоичный файл совпадений d:\dhcp.mdb», а не сопоставленный шаблон, возможно, из-за пустых значений. Если бы это сработало, как только у меня было по 100 символов в обе стороны, я бы выделил это подмножество для того, что мне нужно, также сопоставив IP-адрес (который следует в формате greppable) и имя домена (которое всегда заканчивается 3 нулями)

Поскольку это файл базы данных, я, вероятно, мог бы использовать другой метод, например, фактически взаимодействовать с базой данных, но я чувствую, что довольно близок к этому методу.

Используя Sed, я могу видеть возвращаемые данные из гораздо меньшего файла, куда я вставил некоторые соответствующие данные:

sed -rn "/\I\x00M\x00A\x00H\x00O\x00S\x00T\x001\x002\x003/p" "D:\cruft\Hxma.txt"

Но я не уверен, как вернуть 100 символов до и 100 символов после совпадения, как в приведенном выше grep, и когда я запускаю его для файла базы данных размером 12 МБ, он ничего не возвращает (снимая параметр без вывода сообщений, поэтому он печатает Пространство образца показывает, что он получает ~ 10 КБ, а затем, очевидно, сдается)

Кто-нибудь знает, как я могу решить эту проблему? Я должен добавить, что фактический формат возвращаемых данных не слишком важен, пока данные не будут потеряны (кроме нуля, они мне вообще не нужны).

Если это помогает, то фактический формат текстовых данных, которые я хочу сопоставить, представляется 2-байтовым юникодом, хотя некоторые данные, которые мне нужно вернуть вместе с сопоставлением (т. Е. Первые 4 байта, которые являются порядком байтов с прямым порядком байтов) адрес) не в Unicode.

1 ответ1

0

Вы говорите grep, что искать. Понятие, что вы не знаете, что вы только что сказали grep искать, странно, и я не следую. Цель grep - найти шаблон, который вы ему дадите; не найти строку, местоположение которой вы уже знаете. Я думаю, вам нужно более четко определить, какой кусок этой головоломки вам не хватает.

Кроме того, большинство баз данных имеют инструменты командной строки. Несмотря на то, что MS не создает хороших инструментов для своих баз данных, существует пакет, называемый инструментами MDB, который позволит вам фактически использовать SQL для поиска в БД. Это, безусловно, лучший способ выполнить то, что вы пытаетесь сделать здесь.

Наконец, если вы действительно хотите искать в двоичном файле строки, используя grep, я НАСТОЯТЕЛЬНО рекомендую использовать инструмент strings в пакете binutils . Это отфильтрует непечатаемый символ перед поиском данных. Он также может распечатывать удобные смещения (что обычно требуется в этой ситуации). Вот пример того, как это будет выглядеть (это будет искать в бинарном файле grep любые строки, содержащие слово «не рекомендуется»):

strings -a -t x /bin/grep|grep deprecated

Как видите, это будет намного менее подвержено ошибкам. Я не проверял скорость этого, но я уверен, что это будет сильно зависеть от реального двоичного содержимого в любом случае.

Обновить

Просто понял, что вы работаете в Windows. Systernals делает версию string.exe, которая довольно похожа на программу Linux для работы со строками.

strings.exe -a -o C:\GnuWin\bin\grep.exe|grep deprecated

Кроме того, вы можете попробовать Jackcess для инструмента командной строки MDB, который будет работать с любой ОС с поддержкой JVM.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .