假设我生成了以下二进制文件:
# 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/