我想在一个非常大的文件(文件大小大于2 GB)中找到下面的字节序列,然后在这个字节序列之后打印100个字节。
0x77 0x??{6-8} 0x78 0x07 0x??{18} 0x87 0x0d 0x00{2}
更新:{6-8}表示量词。
这类似于字节签名。通常,我会使用Yara在文件中搜索这样的字节签名。显然,Yara没有正确处理非常大的文件。
这里,??表示通配符,因此它可以匹配任何字节。
下面的grep命令在这种情况下也没有帮助,因为我的搜索模式包括通配符。
grep -obUaP "<\x-hex pattern>" <file>
也许我需要修改和使用某种类型的正则表达式?
谢谢。
发布于 2018-12-08 05:56:12
如果您的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。
https://stackoverflow.com/questions/53676244
复制相似问题