Если ваша оболочка - Bash (или другая оболочка, которая поддерживает $'...'
строки в стиле C), а grep
- это GNU grep
(как это, очевидно, есть), и если я могу правильно угадать, чтоВаше специальное представление шаблона поиска должно представлять, попробуйте
grep -obUaP $'\x77.{6,8}\x78\x07.{18}\x87\x0d\x00{2}\K.{100}' file
, где .
соответствует любому байту, {m,n}
говорит, что повторяет непосредственно предшествующий шаблон по крайней мере m
и самое большееn
раз, один {n}
повторяет что-то ровно n
раз, а последовательности \xab
представляют один байт в шестнадцатеричной записи.K
говорит, что соответствует всему выражению, но печатает часть только после \K
(очевидно, уберите это, если вы действительно хотите напечатать часть подписи тоже).
Однако, потому что в вашем паттерне есть и \x00
, и \x0d
, я не думаю, что это сработает.Если в вашем паттерне есть только один из них, вы можете использовать либо -z
(читать «строку» до следующего нулевого байта), либо перейти к вводу по умолчанию, ориентированному на строку.Если ваши последовательности «что-нибудь» никогда не могут содержать нулевые байты, вы можете временно заменить нулевые байты на (скажем) \xfe
и наоборот:
tr `\376\000' '\000\376' <file | grep ...
, где, очевидно, вы добавите -z
к grep
вариантов и измените шаблон, чтобы найти \xfe
, где ваш исходный шаблон имел нули.(Я думаю GNU grep
все еще использует \xff
для своих собственных гнусных внутренних целей, хотя я не в том месте, где я могу это проверить.)
Или вы могли бы сломаться и сделать это в Python в конце концов.Чтение буфера (скажем, 8192 байта) за раз, поиск шаблона в этой байтовой строке, затем сохранение последних 100 с лишним байтов из предыдущего чтения и добавление следующего буфера в сохраненную последовательность, затем цикл до eof.