以前,我能够使用grep with
在文件中找到二进制模式grep -a -b -o -P '\x01\x02\x03' <file>
通过查找我的意思是我能够获得文件中模式的字节位置。但是当我尝试使用最新版本的grep(v2.16)时,它已经不再有用了。
具体来说,我可以手动验证模式是否存在于文件中,但grep找不到它。奇怪的是,一些模式被正确发现但其他模式却没有。例如,在测试文件中
000102030405060708090a0b0c0e0f
找到 '\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
第一行创建一个文件,其中包含序列中从0x00到0xff的所有可能字节。第二行计算0x70到0x8f范围内连续字节值对的出现次数。我得到的输出是
'\x70\x71'1
'\x71\x72'1
'\x72\x73'1
'\x73\x74'1
'\x74\x75'1
'\x75\x76'1
'\x76\x77'1
'\x77\x78'1
'\x78\x79'1
'\x79\x7a'1
'\x7a\x7b'1
'\x7b\x7c'1
'\x7c\x7d'1
'\x7d\x7e'1
'\x7e\x7f'1
'\x7f\x80'0
'\x80\x81'0
'\x81\x82'0
'\x82\x83'0
'\x83\x84'0
'\x84\x85'0
'\x85\x86'0
'\x86\x87'0
'\x87\x88'0
'\x88\x89'0
'\x89\x8a'0
'\x8a\x8b'0
'\x8b\x8c'0
'\x8c\x8d'0
'\x8d\x8e'0
'\x8e\x8f'0
更新:单字节模式会出现相同的模式 - 找不到值大于0x7f的字节。
答案 0 :(得分:1)
结果可能取决于您当前的语言环境。为避免这种情况,请使用:
env LANG=LC_ALL grep -P "<binary pattern>" <file>
其中env LANG=LC_ALL
会覆盖您的当前语言环境以允许字节匹配。否则,具有非ASCII“字符”的模式(例如\xff
)将不匹配。
例如,这不匹配,因为(至少就我而言)环境具有LANG=en_US.UTF-8
:
$ printf '\x41\xfe\n' | grep -P '\xfe'
成功后:
$ printf '\x41\xfe\n' | env LANG=LC_ALL grep -P '\xfe'
A?