linux - Linux上的二进制grep?

标签 linux binary grep

假设我生成了以下二进制文件:

# generate file:
python -c 'import sys;[sys.stdout.write(chr(i)) for i in (0,0,0,0,2,4,6,8,0,1,3,0,5,20)]' > mydata.bin

# get file size in bytes
stat -c '%s' mydata.bin

# 14

比如说,我想使用类似 grep 的语法查找全零的位置 (0x00)。

 

到目前为止我能做的最好的事情是:

$ hexdump -v -e "1/1 \" %02x\n\"" mydata.bin | grep -n '00'

1: 00
2: 00
3: 00
4: 00
9: 00
12: 00

但是,这会将原始二进制文件中的每个字节隐式转换为多字节 ASCII 表示,grep 对其进行操作;不完全是优化的主要例子:)

是否有类似 Linux 的二进制 grep 的东西?也可能支持类似正则表达式的语法,但也支持字节“字符” - 也就是说,我可以编写类似 'a(\x00*)b' 和 match '字节 'a' (97) 和 'b' (98) 之间出现零个或多个字节 0?

编辑:上下文是我正在开发一个驱动程序,我在其中捕获 8 位数据;数据出现问题,可能是千字节到兆字节,我想检查特定的签名以及它们出现的位置。 (到目前为止,我正在使用千 byte slice 段,因此优化并不那么重要 - 但如果我开始在兆字节长捕获中遇到一些错误,并且我需要分析这些错误,我的猜测是我想要更优化的东西:) 。特别是,我想要一个可以“grep”作为字符的字节的东西 - hexdump 迫使我按字节搜索字符串)

EDIT2:同样的问题,不同的论坛:) grepping through a binary file for a sequence of bytes

EDIT3:感谢@tchrist 的回答,这里也是一个带有“grepping”和匹配以及显示结果的示例(虽然与 OP 的问题不完全相同):

$ perl -ln0777e 'print unpack("H*",$1), "\n", pos() while /(.....\0\0\0\xCC\0\0\0.....)/g' /path/to/myfile.bin

ca000000cb000000cc000000cd000000ce     # Matched data (hex)
66357                                  # Offset (dec)

要将匹配的数据分组为每个字节(两个十六进制字符),则需要指定“H2 H2 H2 ...”,因为匹配字符串中有多少字节;因为我的匹配 '.....\0\0\0\xCC\0\0\0.....' 覆盖 17 个字节,我可以写 '"H2"x17' 在 Perl 中。这些“H2”中的每一个都将返回一个单独的变量(如在列表中),因此还需要使用 join 在它们之间添加空格 - 最终:

$ perl -ln0777e 'print join(" ", unpack("H2 "x17,$1)), "\n", pos() while /(.....\0\0\0\xCC\0\0\0.....)/g' /path/to/myfile.bin

ca 00 00 00 cb 00 00 00 cc 00 00 00 cd 00 00 00 ce
66357

嗯.. Perl 确实是非常好的“二进制 grepping”工具,我必须承认 :) 只要正确地学习语法 :)

最佳答案

这似乎对我有用:

grep --only-matching --byte-offset --binary --text --perl-regexp "<\x-hex pattern>" <file>

短格式:

grep -obUaP "<\x-hex pattern>" <file>

例子:

grep -obUaP "\x01\x02" /bin/grep

输出(Cygwin 二进制):

153: <\x01\x02>
33210: <\x01\x02>
53453: <\x01\x02>

因此您可以再次使用 grep 来提取偏移量。但是不要忘记再次使用二进制模式。

关于linux - Linux上的二进制grep?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4180081/

相关文章:

c - 为什么读取不终止我的 USB 设备?

二进制转十进制的c程序

linux - 在解析运行日志时,有什么可以替代 echo grep?

linux - Grep 不在脚本中工作,但在控制台上工作

java - 如果需要的话,在Java中添加两个二进制字符串(包括填充)的有效方法是什么?

Bash 不等待管道后的完整结果,而是立即对直接输出采取行动

python - 使用python的卷上剩余的跨平台空间

linux - 在特定字母/符号后将文件 2 中的行插入文件 1

c++ - 我不明白的关于默认构造函数的一些事情

sql - 使用 python pymssql 将二进制文件插入 MSSQL db (varbinary)