如何解决以十六进制保存接下来的 32 个字节搜索后
我正在我的驱动器上的所有文件中搜索给定的十六进制值,找到后我需要复制并保存找到后的 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 字符(!),而是字节。 -
-P
选项仅受 GNU grep 支持(以及示例中使用的其他一些选项) - 您可能希望在十六进制编辑器中打开 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 !!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。