以十六进制保存接下来的 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 以实际查看字符。例如,可以使用
hexdump
、hd
或 xxd
。
注意,上面的命令会额外打印匹配的文件名和行号/字节偏移量。这是由使用 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 !!
我正在我的驱动器上的所有文件中搜索给定的十六进制值,找到后我需要复制并保存找到的下一个 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 以实际查看字符。例如,可以使用
hexdump
、hd
或xxd
。
注意,上面的命令会额外打印匹配的文件名和行号/字节偏移量。这是由使用 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 !!