gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:04:54 25 4
gpt4 key购买 nike

以前,我能够使用 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 的字节。

最佳答案

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

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?

关于unix - 使用 grep 在文件中查找二进制模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28746528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com