単純に一連のレコードを連結したバイナリデータファイルを生成しています。各レコードは、(バイナリ)ヘッダーとそれに続くバイナリデータで構成されます。バイナリヘッダー内には、80文字のASCII文字列があります。途中のどこかで、ファイルを書き込む私のプロセスが少しめちゃくちゃになり、各レコードが実際にどれくらいの長さであるかを調べて、この問題をデバッグしようとしています。
これ は非常に関連しているように見えますが、Perlが理解できないため、受け入れられた答えを得ることができませんでした。他の答えは、私がコンパイルしたbgrep
を指していますが、16進数の文字列をフィードする必要があり、ASCII文字列を指定できるツールがあればそれが見つかります。バイナリデータは、文字列とそれが見つかったバイトオフセットを出力します。
つまり、次のようなツールを探しています。
tool foobar filename
または
tool foobar < filename
そしてその出力は次のようなものです:
foobar:10
foobar:410
foobar:810
foobar:1210
...
例えば一致した文字列と、一致が開始されたファイルのバイトオフセット。この例の場合、各レコードは400バイトの長さであると推測できます。
その他の制約:
これにはstrings
を使用できます。
strings -a -t x filename | grep foobar
GNU binutils。
たとえば、/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
grep --byte-offset --only-matching --text foobar filename
--byte-offset
オプションは、一致する各行のオフセットを出力します。
--only-matching
オプションは、一致する各行ではなく、一致するインスタンスごとにオフセットを出力します。
--text
オプションを指定すると、grepはバイナリファイルをテキストファイルとして扱います。
次のように短縮できます。
grep -oba foobar filename
GNU grep
のバージョンで、デフォルトでLinuxに付属しています。BSDのgrep(Macにデフォルトで付属しています)では動作しません。
同じことをしたかった。ひも| grepが機能し、gsarがまさに必要なツールであることがわかりました。
出力は次のようになります。
>gsar.exe -bic -sfoobar filename.bin
filename.bin: 0x34b5: AAA foobar BBB
filename.bin: 0x56a0: foobar DDD
filename.bin: 2 matches found