gpt4 book ai didi

shell - 以十六进制序列递归搜索二进制文件的目录?

转载 作者:行者123 更新时间:2023-12-01 23:43:26 25 4
gpt4 key购买 nike

我用来搜索一些十六进制值的当前命令(比如 0A 8b 02 )涉及:
find . -type f -not -name "*.png" -exec xxd -p {} \; | grep "0a8b02" || xargs -0 -P 4
鉴于以下目标,是否可以改进这一点:

  • 递归搜索文件
  • 显示偏移量和文件名
  • 排除具有某些扩展名的某些文件(以上示例不会搜索 .png 文件)
  • 速度:搜索需要直接处理 200,000 个文件(大约 50KB 到 1MB),总共约 2GB。

  • 如果 xargs,我不太有信心为 4 个处理器正常工作。当 grep 打印文件名时,我也有困难找到匹配项,因为它是从 xxd 管道传输的.有什么建议?

    最佳答案

    如果:

  • 你有 GNU grep
  • 并且您搜索的十六进制字节从不包含换行符 ( 0xa )[1]
  • 如果它们包含 NUL ( 0x ),您必须提供 grep通过文件( -f )而不是直接参数搜索字符串。

  • 使用搜索 0e 8b 02 的示例,以下命令将带您到达那里:
    LC_ALL=C find . -type f -not -name "*.png" -exec grep -FHoab $'\x{0e}\x{8b}\x{02}' {} + |
    LC_ALL=C cut -d: -f1-2
    grep命令产生如下输出行:
    <filename>:<byte-offset>:<matched-bytes>

    其中 LC_ALL=C cut -d: -f1-2然后减少到 <filename>:<byte-offset>
    该命令几乎适用于 BSD grep ,除了报告的字节偏移量始终是模式匹配行的开头。
    换句话说:只有在文件中的匹配项之前没有换行符时,字节偏移量才会正确。
    另外,BSD grep不支持将 NUL ( 0x0 ) 字节指定为搜索字符串的一部分,即使通过带有 -f 的文件提供时也不支持.
  • 请注意,不会有并行处理,但只有少数 grep调用,基于使用 find-exec ... + ,其中,如 xargs , 将命令行中适合的尽可能多的文件名传递给 grep立刻。
  • 通过出租 grep直接搜索字节序列,不需要xxd :
  • 序列被指定为 ANSI C-quoted string ,这意味着转义序列被 shell 扩展为文字,使 Grep 能够搜索结果字符串作为文字(通过 -F ),这样更快。
    链接文章来自 bash手册,但它们在 zsh 中工作(和 ksh )也是。
  • GNU Grep 的替代方法是使用 -P (支持 PCEs,Perl 兼容的正则表达式)带有非预扩展转义序列,但这会更慢:grep -PHoab '\x{0e}\x{8b}\x{02}'
  • LC_ALL=C确保 grep将每个字节视为自己的字符而不应用任何编码规则。
  • -F将搜索字符串视为文字(而不是正则表达式)
  • -H将相关的输入文件名添加到每个输出行;请注意,当给出超过 1 个文件名参数时,Grep 会隐式执行此操作
  • -o只报告匹配的字符串(字节序列),而不是整行(无论如何,行的概念在二进制文件中没有任何意义)[2]
  • -a将二进制文件视为文本文件(如果没有这个,Grep 只会打印文本 Binary file <filename> matches 用于匹配的二进制输入文件)
  • -b报告匹配的字节偏移

  • 如果在给定的输入文件中最多找到 1 个匹配项就足够了,请添加 -m 1 .

    [1] 不能使用换行符,因为 Grep 总是将搜索模式字符串中的换行符视为分隔多个搜索模式。此外,Grep 是基于行的,因此您无法跨行匹配; GNU Grep 的 -null-data按 NUL 字节拆分输入的选项可能会有所帮助,但前提是您的搜索字节序列不包含 NUL 字节;您还必须将您的字节值表示为与 -P 结合的正则表达式中的转义序列。 - 因为你需要使用转义序列 \n代替实际的换行符。

    [2] -o需要制作 -b报告匹配的字节偏移量,而不是行首的偏移量(不幸的是,BSD Grep 总是做后者);此外,这里只报告匹配本身是有益的,因为尝试打印整行会导致不可预测的长输出行,因为二进制文件中没有行的概念;然而,无论哪种方式,从二进制文件输出字节都可能导致终端出现奇怪的渲染行为。

    关于shell - 以十六进制序列递归搜索二进制文件的目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30260835/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com