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

Fer*_*eak 6 linux binary grep

我需要计算0xFF 0x84 0x03 0x07二进制文件中十六进制字符串的出现次数,没有太多麻烦...

mwf*_*ley 8

没有换行符的模式

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

grep -a -c -P '\xFF\x84\x03\x07' myfile.bin
Run Code Online (Sandbox Code Playgroud)
  • -a确保二进制文件不会被跳过

  • -c输出计数

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

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

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

grep -a -o -P '\xFF\x84\x03\x07' myfile.bin | wc -l
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

(请注意,八进制 042 是ASCII"中的双引号。)

另一种方法是,如果您的字符串不包含 Null ( 0x0),则使用该-z标志,并在传递到 之前将 Null 替换为换行符wc

grep -a -o -P -z '\xa\xb\xc' test.bin | tr '\0\n' '\n\0' | wc -l
Run Code Online (Sandbox Code Playgroud)

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


Ken*_*ent 0

你试过了吗grep -a

来自 grep 手册页:

-a, --text
              Process a binary file as if it were text; this is equivalent to the --binary-files=text option.
Run Code Online (Sandbox Code Playgroud)