ascii字符串与二进制文件的“grep”偏移量

时间:2013-01-03 14:39:42

标签: linux bash binary grep ascii

我正在生成二进制数据文件,这些文件只是一系列连接在一起的记录。每条记录包含一个(二进制)标题,后跟二进制数据。在二进制头内是一个长度为80个字符的ascii字符串。在这个过程中的某个地方,我编写文件的过程有点搞砸了,我试图通过检查每个记录的实际长度来调试这个问题。

This似乎非常相关,但我不理解perl,所以我无法在那里得到公认的答案。另一个答案指向我编译的bgrep,但它希望我提供一个十六进制字符串,我宁愿只有一个工具,我可以给它ascii字符串,它会在它找到它二进制数据,打印字符串和找到它的字节偏移量。

换句话说,我正在寻找一些像这样的工具:

tool foobar filename

tool foobar < filename

它的输出是这样的:

foobar:10
foobar:410
foobar:810
foobar:1210
...

e.g。匹配的字符串和匹配开始的文件中的字节偏移量。在这个例子中,我可以推断每条记录的长度是400字节。

其他限制:

  • 使用正则表达式搜索的能力很酷,但我不需要它来解决这个问题
  • 我的二进制文件很大(3.5Gb),所以我想尽可能避免将整个文件读入内存。

3 个答案:

答案 0 :(得分:29)

grep --byte-offset --only-matching --text foobar filename

--byte-offset选项打印每个匹配行的偏移量。

--only-matching选项使其为每个匹配的实例而不是每个匹配的行打印偏移量。

--text选项使grep将二进制文件视为文本文件。

您可以将其缩短为:

grep -oba foobar filename

它适用于grep的GNU版本,默认情况下附带linux。它不适用于BSD grep(默认情况下附带Mac)。

答案 1 :(得分:26)

您可以使用strings

strings -a -t x filename | grep foobar

使用GNU binutils进行测试。

例如,/bin/ls --help发生的位置:

strings -a -t x /bin/ls | grep -- --help

输出:

14938 Try `%s --help' for more information.
162f0       --help     display this help and exit

答案 2 :(得分:0)

我想做同样的任务。虽然字符串| grep工作,我发现gsar是我需要的工具。

http://tjaberg.com/

输出如下:

>gsar.exe -bic -sfoobar filename.bin
filename.bin: 0x34b5: AAA foobar BBB
filename.bin: 0x56a0: foobar DDD
filename.bin: 2 matches found