我需要在二进制文件中计算十六进制字符串0xFF 0x84 0x03 0x07
的出现次数,没有太多麻烦......是否有一种从linux命令行轻松获取此数据的方法,或者我应该编写专用的代码来做吗?
答案 0 :(得分:1)
如果您的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
将每个匹配分隔到自己的行上,wc -l
计算行数。请注意,这取决于您的二进制字符串不包含换行符这一事实。
答案 1 :(得分:0)
你试过grep -a
吗?
来自grep man page:
-a, --text
Process a binary file as if it were text; this is equivalent to the --binary-files=text option.
答案 2 :(得分:0)
使用hexdump,如
hexdump -v -e '"0x" 1/1 "%02X" " "' <filename> | grep -oh "0xFF 0x84 0x03 0x07" |wc -w
hexdump
将输出给定格式的二进制文件,如0xNN
grep
会在不考虑在一行重复的相同内容的情况下找到字符串的所有匹配项
wc
会给你最后的计数
答案 3 :(得分:0)
怎么样:
$ hexdump a.out | grep -Ec 'ff ?84 ?03 ?07'
答案 4 :(得分:0)
这并没有完全回答你的问题,但是当搜索字符串是ASCII但文件是二进制文件时确实解决了问题:
cat binaryfile | sed 's/SearchString/SearchString\n/g' | grep -c SearchString
基本上,&#39; grep&#39;几乎没有,除非它只计算一次,如果中间没有换行字节,所以我添加了换行字节。