以十六进制保存接下来的 32 个字节(搜索后)

Save next 32 bytes in hex (after search)

我正在我的驱动器上的所有文件中搜索给定的十六进制值,找到后我需要复制并保存找到的下一个 32 字节(一个文件中可能有很多次)。

现在我正在搜索这样的文件:

ggrep -obaRUP "\x01\x02\x03\x04" . > outputfile.txt

但是这个脚本只返回文件路径。我最好只使用标准 Linux / Mac 工具。

使用 -P (--perl-regexes) 您可以使用 \K 转义序列来清除匹配缓冲区。然后再匹配 .{32} 个字符(!):

LANG=C grep -obaRUP "\x01\x02\x03\x04\K.{32,32}" . > output.file

注:

  • 我正在使用 LANG=C 强制使用单字节编码而非 utf-8 的语言环境。这是为了确保 .{32} 不会意外匹配 unicode 字符(!),而是字节。
  • 只有 GNU grep 支持 -P 选项(以及您的示例中使用的其他一些选项)
  • 您可能想在十六进制编辑器中打开 output.file 以实际查看字符。例如,可以使用 hexdumphdxxd

注意,上面的命令会额外打印匹配的文件名和行号/字节偏移量。这是由使用 grep -R (recursive).

引起的

要仅获取输出中的 32 个字节,除此之外,我建议使用 find:

find . -type f -exec grep -oaUP '\x01\x02\x03\x04\K.{32}' {} \; 

我的测试有点简单,但这对我有用。

$: IFS=: read -r file offset data <<< "$(grep -obaRUP "\x01\x02\x03\x04.{32}" .)"
$: echo "$file @ $((offset+4)):[${data#????}]"
./x @ 10:[HERE ARE THE THIRTY-TWO BYTES !!]

我没有做复杂的回溯,而是把 ^A^B^C^D 接下来的 32 个字节拼凑起来,然后去掉前导 4 个字节领域。

不过,

@hek2mgl 的 \K 使所有这些都变得不必要了。使用 -h 删除文件名。

$: grep -obahRUP "\x01\x02\x03\x04\K.{32}" .
10:HERE ARE THE THIRTY-TWO BYTES !!

如果不需要偏移量,请去掉-b

$: grep -oahRUP "\x01\x02\x03\x04\K.{32}" .
HERE ARE THE THIRTY-TWO BYTES !!