2013-01-03 14 views
20

のASCII文字列のオフセット。各レコードはバイナリデータの後に(バイナリ)ヘッダが続きます。バイナリヘッダ内には、80文字のASCII文字列があります。どこかの道に沿って、ファイルを書き込むの私のプロセスは少しは台無しと私は各レコードが実際にどのくらい検査することで、この問題をデバッグしようとしていました。「グレップは」私は単純に一緒に連結一連のレコードですバイナリデータファイルを生成していたバイナリファイル

Thisは非常に関連すると思われるが、私はPerlを理解していないので、私は仕事にそこに受け入れられた答えを得ることができていません。他の回答私がコンパイルしたが、それは私がそれを16進文字列を供給したいと私はむしろちょうど私がそれをASCII文字列を与えることができ、それがバイナリデータでそれを見つけるツールを持っていると思いますbgrepを指し、印刷文字列と見つかったバイトオフセット。言い換えれば

は、私はこのような役割を果たし、いくつかのツールを探しています:

tool foobar filename 

または

tool foobar < filename 

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

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

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

他の制約:正規表現で検索する

  • 能力はクールですが、私はこの問題のために
  • 私のバイナリファイルを、それを必要としない(3.5GB)大きいですので、私はしたいのですが可能であれば、ファイル全体をメモリに読み込まないようにしてください。
+0

ARGV!私は英語の文法の習熟が、どんな点で泥沼に入ったのか分かりません。私のためにそれを修正していただきありがとうございます@ケビン – mgilson

答えて

23

あなたはこのためにstringsを使用することができます。

GNU binutilsのでテスト
strings -a -t x filename | grep foobar 

/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 
+3

私は 'strings -a -t d filename | grep foobar'を実行して16進数ではなく10進数で出力します。さもなければ、grepのさまざまな味でうまくいくような素晴らしい答えがあります。 – mgilson

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

--byte-offsetオプションプリントは、各マッチラインのオフセット。

--only-matchingオプションを使用すると、一致する各行ではなく、一致するインスタンスごとにオフセットが印刷されます。

--textオプションを使用すると、grepはバイナリファイルをテキストファイルとして扱います。

あなたはそれを短縮することができます:それは、デフォルトでのLinuxが付属していますgrepのGNU版で動作します

grep -oba foobar filename 

。これは、(デフォルトではマックが付属しています)BSDのはgrepでは動作しません。

+0

私はこれを試しました、それは言う:「バイナリファイルのファイル名が一致します。私のシステムはUbuntu Linuxで、 'grep --version'は以下のようになります。" GNU grep 2.5.2 " – mgilson

+1

バイナリファイルをテキストとして扱う' -a'オプションを追加してみてください。 –

+0

乾杯、 '-a'で動作します。 +1。 – mgilson

0

私は同じ作業をしたかったのです。しかし、文字列| 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