首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Python在超大文件中查找字节序列

使用Python在超大文件中查找字节序列
EN

Stack Overflow用户
提问于 2018-12-08 04:11:58
回答 1查看 420关注 0票数 2

我想在一个非常大的文件(文件大小大于2 GB)中找到下面的字节序列,然后在这个字节序列之后打印100个字节。

代码语言:javascript
运行
复制
0x77 0x??{6-8} 0x78 0x07 0x??{18} 0x87 0x0d 0x00{2}

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

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

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

下面的grep命令在这种情况下也没有帮助,因为我的搜索模式包括通配符。

代码语言:javascript
运行
复制
grep -obUaP "<\x-hex pattern>" <file>

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

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-12-08 05:56:12

如果您的shell是Bash (或者支持$'...'“C风格”字符串的另一个shell ),并且您的grep是GNU grep (显然是这样),并且如果我能够正确地猜测您的搜索模式的即席表示应该表示什么,请尝试

代码语言:javascript
运行
复制
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替换零字节,反之亦然:

代码语言:javascript
运行
复制
tr `\376\000' '\000\376' <file | grep ...

显然,您需要将-z添加到grep选项中,并更改模式以查找原始模式为零的\xfe。(我认为GNU grep仍然将\xff用于其邪恶的内部目的,尽管我无法验证这一点。)

,你可以分解一下,用Python语言来完成。一次读取一个缓冲区(比方说,8192字节),在该字节串中查找模式,然后保留上一次读取的最后100多个字节,并将下一个缓冲区附加到保留的序列中,然后循环直到eof。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53676244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档