37

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

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

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

tool foobar filename

或者

tool foobar < filename

它的输出是这样的:

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

例如,匹配的字符串和匹配开始的文件中的字节偏移量。在本例中,我可以推断出每条记录的长度为 400 字节。

其他约束:

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

3 回答 3

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

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

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

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

您可以将其缩短为:

grep -oba foobar filename

它适用于 GNU 版本grep,默认情况下与 linux 一起提供。它不适用于 BSD grep(默认情况下与 Mac 一起提供)。

于 2013-01-03T14:57:18.133 回答
30

你可以用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
于 2013-01-03T14:46:36.483 回答
1

我想做同样的任务。虽然字符串 | 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
于 2014-09-18T02:03:26.223 回答