正如标题所示我想要一个相当大(约100MB)的二进制文件,对于二进制字符串 - 这个二进制字符串不到5K。
我使用-P选项尝试了grep,但是当模式只有几个字节时,这似乎只返回匹配 - 当我达到大约100个字节时,它不再找到任何匹配。
我也试过bgrep。这最初运作良好,但是,当我需要将模式扩展到我现在的长度时,我只是得到“无效/空搜索字符串”错误。
讽刺的是,在Windows中,我可以使用HxD搜索文件,然后在实例中找到它。我真正需要的是一个Linux命令行工具。感谢您的帮助,
西蒙
答案 0 :(得分:2)
假设我们有几个大的二进制数据文件。对于一个不匹配的大文件,我们创建一个100MB的文件,其内容都是NUL字节。
dd ibs=1 count=100M if=/dev/zero of=allzero.dat
对于我们想要匹配的那个,创建一百个随机兆字节。
#! /usr/bin/env perl
use warnings;
binmode STDOUT or die "$0: binmode: $!";
for (1 .. 100 * 1024 * 1024) {
print chr rand 256;
}
以./mkrand >myfile.dat
执行。
最后,将已知匹配提取到名为pattern
的文件中。
dd skip=42 count=10 if=myfile.dat of=pattern
我假设您只想要匹配(-l
)的文件,并希望您的模式按字面处理(-F
或--fixed-strings
)。我怀疑你可能已经遇到了-P
的长度限制。
您可能想要使用--file=PATTERN-FILE
选项,但grep
会将 PATTERN-FILE 的内容解释为换行符分隔的模式,因此可能会出现这种情况。 5KB模式包含换行符,您将遇到编码问题。
所以希望你的系统ARG_MAX
足够大并且适合它。请务必引用pattern
的内容。例如:
$ grep -l --fixed-strings "$(cat pattern)" allzero.dat myfile.dat myfile.dat
答案 1 :(得分:0)
尝试使用grep -U
将文件视为二进制文件。
另外,您如何指定搜索模式?它可能只需要转义才能在shell参数扩展中幸存下来
答案 2 :(得分:0)
由于你要搜索的字符串很长。您可以通过实施Boyer-Moore搜索算法获益,当搜索字符串非常长时,该算法非常有效
http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm
wiki还包含一些示例代码的链接。
答案 3 :(得分:0)
您可能希望查看一个简单的Python脚本。
match= (b"..."
b"...."
b"..." ) # Some byte string literal of immense proportions
with open("some_big_file","rb") as source:
block= read(len(match))
while block != match:
byte= read(1)
if not byte: break
block= block[1:]+read(1)
这可能在Linux和Windows下可靠地运行。