我想在一个非常大的文件(文件大小大于2 GB)中找到以下字节序列,并在此字节序列后立即打印100个字节。
$nearSphere
更新:{6-8}表示一个量词。
这类似于字节签名。通常,我会使用Yara在文件中搜索此类字节签名。显然,Yara无法正确处理非常大的文件。
在这里,??表示通配符,因此可以匹配任何字节。
下面的grep命令在这种情况下也无济于事,因为我的搜索模式包括通配符。
0x77 0x??{6-8} 0x78 0x07 0x??{18} 0x87 0x0d 0x00{2}
也许我需要修改并使用某种类型的正则表达式?
谢谢。
答案 0 :(得分:0)
如果您的shell是Bash(或另一个支持$'...'
“ C风格”字符串的shell),而您的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。 / p>