Linux でバイナリ grep を使用するには? 質問する

Linux でバイナリ grep を使用するには? 質問する

次のバイナリ ファイルを生成したとします。

# generate file:
python -c 'import sys;[sys.stdout.write(chr(i)) for i in (0,0,0,0,2,4,6,8,0,1,3,0,5,20)]' > mydata.bin

# get file size in bytes
stat -c '%s' mydata.bin

# 14

0x00そして、 grep のような構文を使用して、すべてのゼロ ( ) の位置を見つけたいとします。

 

今のところ私ができる最善のことは、次のとおりです。

$ hexdump -v -e "1/1 \" %02x\n\"" mydata.bin | grep -n '00'

1: 00
2: 00
3: 00
4: 00
9: 00
12: 00

ただし、これは元のバイナリ ファイルの各バイトを暗黙的にマルチバイト ASCII 表現に変換してgrep操作します。これは最適化の典型的な例とは言えません :)

Linux 用のバイナリのようなものはありますかgrep? おそらく、正規表現のような構文をサポートするだけでなく、バ​​イト「文字」もサポートするもの、つまり、 ' a(\x00*)b' のようなものを記述して、バイト 'a' (97) と 'b' (98) の間にあるバイト 0 の '0 回以上の' 出現に一致させることができるでしょうか?

編集: コンテキストとしては、8 ビット データをキャプチャするドライバーに取り組んでいます。キロバイトからメガバイトに及ぶ可能性のあるデータに問題が発生し、特定のシグネチャとその発生場所を確認したいと考えています。(今のところ、キロバイト単位のスニペットを扱っているので、最適化はそれほど重要ではありません。しかし、メガバイト単位のキャプチャでエラーが発生し、それを分析する必要がある場合は、もっと最適化されたものが欲しくなると思います。特に、バイトを文字として「grep」できるものが欲しいです。hexdumpバイトごとに文字列を検索するように強制されます。

編集2: 同じ質問ですが、フォーラムが違います :)バイナリファイル内のバイトシーケンスをgrepする

編集3: @tchristの回答のおかげで、ここにも「grepping」とマッチング、そして結果を表示する例があります(OPと全く同じ質問ではないが):

$ perl -ln0777e 'print unpack("H*",$1), "\n", pos() while /(.....\0\0\0\xCC\0\0\0.....)/g' /path/to/myfile.bin

ca000000cb000000cc000000cd000000ce     # Matched data (hex)
66357                                  # Offset (dec)

一致したデータをそれぞれ 1 バイト (2 つの 16 進文字) としてグループ化するには、一致した文字列のバイト数と同じ数だけ「H2 H2 H2 ...」を指定する必要があります。一致した ' .....\0\0\0\xCC\0\0\0.....' は 17 バイトをカバーするため、Perl では ' ' と記述できます"H2"x17。これらの「H2」はそれぞれ別の変数 (リストの場合と同様) を返すため、joinそれらの間にスペースを追加するためにも使用する必要があります。

$ perl -ln0777e 'print join(" ", unpack("H2 "x17,$1)), "\n", pos() while /(.....\0\0\0\xCC\0\0\0.....)/g' /path/to/myfile.bin

ca 00 00 00 cb 00 00 00 cc 00 00 00 cd 00 00 00 ce
66357

そうですね...確かに Perl は「バイナリ grep」機能が非常に優れていることは認めざるを得ません :) 構文を正しく学習すればですが :)

ベストアンサー1

これは私にとってはうまくいくようです:

grep --only-matching --byte-offset --binary --text --perl-regexp "<\x-hex pattern>" <file>

ショートフォーム:

grep -obUaP "<\x-hex pattern>" <file>

例:

grep -obUaP "\x01\x02" /bin/grep

出力(シグウィンバイナリ):

153: <\x01\x02>
33210: <\x01\x02>
53453: <\x01\x02>

したがって、これを再度 grep してオフセットを抽出できます。ただし、再度バイナリ モードを使用することを忘れないでください。

おすすめ記事