Unix 使用grep在文件中查找二进制模式

Unix 使用grep在文件中查找二进制模式,unix,grep,pattern-matching,Unix,Grep,Pattern Matching,以前,我使用grep和 grep -a -b -o -P '\x01\x02\x03' <file> 已找到'\x01\x02',但未找到'\x07\x08' 任何有助于澄清这种行为的帮助都将受到高度赞赏 更新:上述示例未显示所述行为。下面是显示问题的命令 printf `for (( x=0; x<256; x++ )); do printf "\x5cx%02x" $x; done` > test for (( x=$((0x70)); x<$((0x8f)

以前,我使用grep和

grep -a -b -o -P '\x01\x02\x03' <file>
已找到
'\x01\x02'
,但未找到
'\x07\x08'

任何有助于澄清这种行为的帮助都将受到高度赞赏

更新:上述示例未显示所述行为。下面是显示问题的命令

printf `for (( x=0; x<256; x++ )); do printf "\x5cx%02x" $x; done` > test

for (( x=$((0x70)); x<$((0x8f)); x++ )); do
    p=`printf "\'\x5cx%02x\x5cx%02x\'" $x  $((x+1))`
    echo -n $p
    echo $p test | xargs grep -c -a -o -b -P | cut -d: -f1
done

更新:单字节模式也会出现相同的模式——找不到值大于0x7f的字节。

结果可能取决于您当前的语言环境。要避免这种情况,请使用:

env LANG=LC_ALL grep -P "<binary pattern>" <file>
成功时:

$ printf '\x41\xfe\n' | env LANG=LC_ALL grep -P '\xfe'
A?

\x07\x08
不在从
\x07
\x09
的示例数据中。触摸,这是一个打字错误。它在我的实际测试文件中。将该示例输入转换为一个包含这些字节的文件(
printf'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0e\x0f'>文件
),grep对我来说既适用于'\x01\x02',又适用于'\x07\x08'。仔细检查您的文件?原始测试脚本存在无法打印的字符(或其他问题)。它无法报告任何超过'\x07\x08'的模式。我用一个固定的脚本更新了问题。适合我:
env LANG=LC_ALL grep -P "<binary pattern>" <file>
$ printf '\x41\xfe\n' | grep -P '\xfe'
$ printf '\x41\xfe\n' | env LANG=LC_ALL grep -P '\xfe'
A?