Я использую 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.