我有一个像这样的二进制文件(在Emacs十六进制模式下打开):如果文件中存在十六进制值 '22081b00081f091d2733170d123f3114',我该如何grep?
00000000: 2b08 1b00 1418 0825 0407 3830 271d 170d +......%..80'...
00000010: 2208 1b00 081f 091d 2733 170d 123f 3114 ".......'3...?1.
00000020: 1909 1b00 0934 1f10 2503 3803 111c 3821 .....4..%.8...8!
Run Code Online (Sandbox Code Playgroud)
在我的示例中,它应该返回一个命中,因为我要查找的十六进制值位于地址 0x10 中。
Lev*_*ans 10
您可以使用:
xxd -p /your/file | tr -d '\n' | grep -c '22081b00081f091d2733170d123f3114'
Run Code Online (Sandbox Code Playgroud)
如果内容匹配,它将返回 1,否则返回 0。
xxd -p
将文件转换为纯十六进制转储,tr -d '\n'
删除由添加的换行符xxd
,并grep -c
计算匹配的行数。
这样,无论输入在文件中的位置如何,它都会匹配(如果它在您的示例中位于位置 0x18,则它会被切成两部分,如果不使用 ,grep 将无法匹配它tr
)。但是,您在文件中没有它的位置。
grep
无法单独执行此操作 - 它在更高级别上运行并搜索编码文本。
一种解决方案是将od
二进制转换为十六进制并以 ASCII 输出,然后您可以将其输入 grep 中以搜索十六进制字符串:
od -t x -A n <input_file> | grep <hex string>
Run Code Online (Sandbox Code Playgroud)
然而,这会导致进一步的问题,因为它会插入换行符和空格来格式化十六进制。要处理这个问题,您可以尝试使用sed
.