使用Python在很大的文件中查找字节序列

时间:2018-12-07 20:11:58

标签: python regex linux grep

我想在一个非常大的文件(文件大小大于2 GB)中找到以下字节序列,并在此字节序列后立即打印100个字节。

$nearSphere

更新:{6-8}表示一个量词。

这类似于字节签名。通常,我会使用Yara在文件中搜索此类字节签名。显然,Yara无法正确处理非常大的文件。

在这里,??表示通配符,因此可以匹配任何字节。

下面的grep命令在这种情况下也无济于事,因为我的搜索模式包括通配符。

0x77 0x??{6-8} 0x78 0x07 0x??{18} 0x87 0x0d 0x00{2}

也许我需要修改并使用某种类型的正则表达式?

谢谢。

1 个答案:

答案 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>