Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从更大的二进制文件中对较大的二进制值进行grepping_Linux_Search_Command Line_Binary_Grep - Fatal编程技术网

Linux 从更大的二进制文件中对较大的二进制值进行grepping

Linux 从更大的二进制文件中对较大的二进制值进行grepping,linux,search,command-line,binary,grep,Linux,Search,Command Line,Binary,Grep,正如标题所示,我想grep一个相当大(大约100MB)的二进制文件,作为一个二进制字符串-这个二进制字符串刚好不到5K 我尝试过grep使用-p选项,但这似乎只在模式只有几个字节时返回匹配项——当我增加到大约100字节时,它不再找到任何匹配项 我也试过了。然而,最初这很有效,当我需要将模式扩展到现在的长度时,我只得到“无效/空搜索字符串”错误 讽刺的是,在Windows中,我可以使用HxD搜索文件,并在实例中找到它。但我真正需要的是一个Linux命令行工具 谢谢你的帮助 Simon尝试使用将文件

正如标题所示,我想grep一个相当大(大约100MB)的二进制文件,作为一个二进制字符串-这个二进制字符串刚好不到5K

我尝试过grep使用-p选项,但这似乎只在模式只有几个字节时返回匹配项——当我增加到大约100字节时,它不再找到任何匹配项

我也试过了。然而,最初这很有效,当我需要将模式扩展到现在的长度时,我只得到“无效/空搜索字符串”错误

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

谢谢你的帮助


Simon

尝试使用将文件视为二进制文件的
grep-U


另外,您如何指定搜索模式?它可能只需要转义就可以在shell参数扩展中生存,因为您正在搜索的字符串相当长。您可以通过Boyer-Moore搜索算法的实现获益,该算法在搜索字符串很长时非常有效


wiki还提供了一些示例代码的链接

您可能想看看一个简单的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下都能可靠地工作。

假设我们有两个大的二进制数据文件。对于一个不应该匹配的大文件,我们创建一个100MB的文件,其内容都是NUL字节

dd ibs=1 count=100M if=/dev/zero of=allzero.dat 将其作为
/mkrand>myfile.dat
执行

最后,将已知匹配项提取到名为
pattern
的文件中

dd skip=42 count=10 if=myfile.dat of=pattern
我们真的需要更多关于搜索模式的信息。请注意,perl-P需要perl样式的正则表达式。这真的是你想要的吗?AFAICT HxD根本不支持正则表达式…不太支持-P只是我过去用来让grep为我找到二进制匹配的东西。我一点也不在乎reg-ex。我只需要在许多文件中查找一个大的、静态的二进制模式。目前我正在使用grep-U-P“\xE1\x01\x08\x73\xE3\x03…”bigfile。我该怎么逃走呢?还有,有没有办法让grep从文件中读取模式?我试过-f,但没用。谢谢 dd skip=42 count=10 if=myfile.dat of=pattern $ grep -l --fixed-strings "$(cat pattern)" allzero.dat myfile.dat myfile.dat