37

単純に連結された一連のレコードであるバイナリ データ ファイルを生成しています。各レコードは、(バイナリ) ヘッダーとそれに続くバイナリ データで構成されます。バイナリ ヘッダー内には、長さ 80 文字の ASCII 文字列があります。途中のどこかで、ファイルを書き込むプロセスが少し混乱したため、各レコードの実際の長さを調べて、この問題をデバッグしようとしています。

これは非常に関連しているようですが、私はperlを理解していないので、そこで受け入れられた答えを得ることができませんでした. 他の回答bgrepは私がコンパイルしたことを示していますが、16進文字列を入力する必要があり、ASCII文字列を指定できるツールがあればいいのですが、バイナリデータでそれを見つけて、文字列とそれが見つかったバイト オフセット。

つまり、次のようなツールを探しています。

tool foobar filename

また

tool foobar < filename

その出力は次のようなものです。

foobar:10
foobar:410
foobar:810
foobar:1210
...

たとえば、一致した文字列と、一致が開始されたファイル内のバイト オフセット。この例では、各レコードの長さが 400 バイトであると推測できます。

その他の制約:

  • 正規表現で検索する機能はクールですが、この問題には必要ありません
  • 私のバイナリ ファイルは大きい (3.5Gb) ので、可能であればファイル全体をメモリに読み込まないようにしたいと考えています。
4

3 に答える 3

42
grep --byte-offset --only-matching --text foobar filename

この--byte-offsetオプションは、一致する各行のオフセットを出力します。

この--only-matchingオプションにより、一致する各行ではなく、一致するインスタンスごとにオフセットが出力されます。

この--textオプションにより、grep はバイナリ ファイルをテキスト ファイルとして扱います。

次のように短縮できます。

grep -oba foobar filename

grepデフォルトで Linux に付属している の GNU バージョンで動作します。BSD grep (デフォルトで Mac に付属) では機能しません。

于 2013-01-03T14:57:18.133 に答える
30

これに使用できますstrings

strings -a -t x filename | grep foobar

GNU binutils でテスト済み。

たとえば、 in/bin/ls--help発生する場所は次のとおりです。

strings -a -t x /bin/ls | grep -- --help

出力:

14938 Try `%s --help' for more information.
162f0       --help     display this help and exit
于 2013-01-03T14:46:36.483 に答える
1

私は同じ仕事をしたかった。文字列ですが | grep が機能し、gsar が必要なツールであることがわかりました。

http://tjaberg.com/

出力は次のようになります。

>gsar.exe -bic -sfoobar filename.bin
filename.bin: 0x34b5: AAA foobar BBB
filename.bin: 0x56a0: foobar DDD
filename.bin: 2 matches found
于 2014-09-18T02:03:26.223 に答える