如果您的版本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可能是相互结合的实验。但是对于简单的表达式并且没有空值,我想这没问题。)
你试过了吗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)