从更大的二进制文件中获取大二进制值

时间:2011-07-04 15:22:46

标签: linux search command-line binary grep

正如标题所示我想要一个相当大(约100MB)的二进制文件,对于二进制字符串 - 这个二进制字符串不到5K。

我使用-P选项尝试了grep,但是当模式只有几个字节时,这似乎只返回匹配 - 当我达到大约100个字节时,它不再找到任何匹配。

我也试过bgrep。这最初运作良好,但是,当我需要将模式扩展到我现在的长度时,我只是得到“无效/空搜索字符串”错误。

讽刺的是,在Windows中,我可以使用HxD搜索文件,然后在实例中找到它。我真正需要的是一个Linux命令行工具。

感谢您的帮助,

西蒙

4 个答案:

答案 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下可靠地运行。