Linux 计算二进制数据出现的次数

Linux 计算二进制数据出现的次数,linux,binary,grep,Linux,Binary,Grep,我需要计算二进制文件中十六进制字符串0xFF 0x84 0x03 0x07的出现次数,而不需要太多麻烦。。。是否有一种从linux命令行快速搜索此数据的方法,或者我应该编写专用代码来执行此操作?您是否尝试过grep-a 从grep手册页: -a, --text Process a binary file as if it were text; this is equivalent to the --binary-files=text option. 使用hextum

我需要计算二进制文件中十六进制字符串
0xFF 0x84 0x03 0x07
的出现次数,而不需要太多麻烦。。。是否有一种从linux命令行快速搜索此数据的方法,或者我应该编写专用代码来执行此操作?

您是否尝试过
grep-a

从grep手册页:

-a, --text
              Process a binary file as if it were text; this is equivalent to the --binary-files=text option.
使用hextump-like

hextump-v-e'“0x”1/1“%02X”“”| grep-oh“0xFF 0x84 0x03 0x07”| wc-w

hextump
将以给定格式(如0xNN)输出二进制文件

grep
将查找字符串的所有匹配项,而不考虑在一行中重复出现的相同项

wc
将为您提供最终计数

如何:

$ hexdump a.out | grep -Ec 'ff ?84 ?03 ?07'

这并不能完全回答您的问题,但确实解决了搜索字符串为ASCII但文件为二进制文件时的问题:

cat binaryfile | sed 's/SearchString/SearchString\n/g' | grep -c SearchString

基本上,'grep'几乎就在那里了,除了如果中间没有换行符字节,它只计算一次出现,所以我添加了换行符。

如果您的
grep
版本使用
-p
参数,那么您可以使用
grep-a-p
在二进制文件中搜索任意二进制字符串。这接近您想要的:

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

  • -c
    输出计数

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

不幸的是,
grep-c
将只计算模式出现的“行”数,即使它在一行上出现多次。(我不知道为什么这会是一个可取的功能)

要使用
grep
获得准确的出现次数,您似乎需要执行以下操作:

grep -a -o -P '\xFF\x84\x03\x07' myfile.bin | wc -l
grep-o
将每个匹配项分离到自己的行中,并对行进行计数。请注意,这取决于二进制字符串不包含换行符这一事实。

My
hexdump
(默认情况下)将换行、为每行添加偏移量并交换字节对的尾端。这种格式对grep来说是一个真正的挑战,它可以捕获所有的案例,同时还可以通过偏移量避免误报。