gpt4 book ai didi

linux - 统计二进制数据出现的次数

转载 作者:IT王子 更新时间:2023-10-29 01:27:16 25 4
gpt4 key购买 nike

我需要计算二进制文件中十六进制字符串 0xFF 0x84 0x03 0x07 的出现次数,没有太多麻烦...有没有一种快速的方法可以从 linux 命令中获取这些数据行还是我应该编写专用代码来做到这一点?

最佳答案

没有换行符的模式

如果你的grep版本接受了-P参数,那么你可以使用grep -a -P,来搜索任意一个二进制文件中的二进制字符串(没有换行符)。这接近你想要的:

grep -a -c -P '\xFF\x84\x03\x07' myfile.bin
  • -a 确保不会跳过二进制文件

  • -c 输出计数

  • -P 指定您的模式是一个 Perl 兼容的正则表达式 (PCRE),它允许字符串包含上述 \xNN 格式的十六进制字符.

不幸的是,grep -c 只会计算模式出现的“行”数——而不是实际出现的次数。

要使用 grep 获取准确的出现次数,您似乎需要这样做:

grep -a -o -P '\xFF\x84\x03\x07' myfile.bin | wc -l

grep -o 将每个匹配项分隔到自己的行中,wc -l 计算行数。

包含换行符的模式

如果您确实需要 grep 查找换行符,我能想到的一种解决方法是使用 tr 将该字符换成另一个不在您的搜索词中的字符。

# set up test file (0a is newline)
xxd -r <<< '0:08 09 0a 0b 0c 0a 0b 0c' > test.bin

# grep for '\xa\xb\xc' doesn't work
grep -a -o -P '\xa\xb\xc' test.bin | wc -l

# swap newline with oct 42 and grep for that
tr '\n\042' '\042\n' < test.bin | grep -a -o -P '\042\xb\xc' | wc -l

(注意 042 八进制是双引号 " 标志 ASCII .)

另一种方法,如果您的字符串不包含空值 (0x0),将使用 -z标记,并在传递给 wc 之前将空值换成换行符。

grep -a -o -P -z '\xa\xb\xc' test.bin | tr '\0\n' '\n\0' | wc -l

(请注意,-z-P 可能是 experimental 相互结合。但是对于简单的表达式且没有空值,我想这没问题。 )

关于linux - 统计二进制数据出现的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15336386/

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