如何在二进制文件中的字符串中 grep 十六进制值?

mic*_*ael 8 grep

我有一个像这样的二进制文件(在Emacs十六进制模式下打开):如果文件中存在十六进制值 '22081b00081f091d2733170d123f3114',我该如何grep?

00000000: 2b08 1b00 1418 0825 0407 3830 271d 170d  +......%..80'...
00000010: 2208 1b00 081f 091d 2733 170d 123f 3114  ".......'3...?1.
00000020: 1909 1b00 0934 1f10 2503 3803 111c 3821  .....4..%.8...8!
Run Code Online (Sandbox Code Playgroud)

在我的示例中,它应该返回一个命中,因为我要查找的十六进制值位于地址 0x10 中。

Lev*_*ans 10

您可以使用:

xxd -p /your/file | tr -d '\n' | grep -c '22081b00081f091d2733170d123f3114'
Run Code Online (Sandbox Code Playgroud)

如果内容匹配,它将返回 1,否则返回 0。

xxd -p将文件转换为纯十六进制转储,tr -d '\n'删除由添加的换行符xxd,并grep -c计算匹配的行数。

这样,无论输入在文件中的位置如何,它都会匹配(如果它在您的示例中位于位置 0x18,则它会被切成两部分,如果不使用 ,grep 将无法匹配它tr)。但是,您在文件中没有它的位置。


ran*_*on1 0

grep无法单独执行此操作 - 它在更高级别上运行并搜索编码文本。

一种解决方案是将od二进制转换为十六进制并以 ASCII 输出,然后您可以将其输入 grep 中以搜索十六进制字符串:

od -t x -A n <input_file> | grep <hex string>
Run Code Online (Sandbox Code Playgroud)

然而,这会导致进一步的问题,因为它会插入换行符和空格来格式化十六进制。要处理这个问题,您可以尝试使用sed.

  • 我不会说 `grep` *不能* 做到这一点(参见@gb0tech的答案和http://stackoverflow.com/questions/4180081/binary-grep-on-linux),但它的工作原理编码文本绝对是正确且有帮助的。如果您需要在 grep 之前使用“od”将所有内容转换为十六进制字符串,那么对性能的影响也很小。 (2认同)