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

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

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

我也尝试过bgrep.但是,当我需要将模式扩展到我现在的长度时,我只是得到“无效/空搜索字符串”错误.

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

谢谢你的帮助,

西蒙

解决方法

假设我们有几个大的二进制数据文件.对于一个不匹配的大文件,我们创建一个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足够大并且适合它.一定要引用模式的内容.例如:

$grep -l --fixed-strings "$(cat pattern)" allzero.dat myfile.dat
myfile.dat

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...