hexdump
状況は次のとおりです。出力で文字列Aと文字列Bの間のバイトを見つける必要があります。 16進ダンプは次のように構成されています。
-random bytes
-A + useful bytes + B
-random bytes
-A + useful bytes + B
-random bytes
今質問は: - 「AからBへ」grepは可能ですか?マニュアルページやインターネットではこのような内容を見ることはできません。手動で行うことができることを知っていますが、スクリプトを作成する必要があります。 - 行番号なしで16進ダンプ出力を表示できますか?合理的なようですが、まだ方法が見つかりませんでした。
ありがとうございます!
編集:ループバックデバイスから削除された2つのJPEG画像を復元しようとしているので、すべての出力を表示することはできませんが(非常に長いです)、ここにその一部があります。
0010400 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 01
0010410 00 01 00 00 ff fe 00 3c 43 52 45 41 54 4f 52 3a
[...]
0030f50 3e e9 fb a4 54 37 70 7f cb 55 03 fd af f1 a2 32
0030f60 e8 26 8f ff d9 00 00 00 00 00 00 00 00 00 00 00
標準によると、JPEGファイルは0xff 0xd8で始まり、0xff 0xd9で終わるので、これら2つの文字列間のすべての情報を取得したいと思います。 (この方法はうまくいくべきだと思いますが、まだテストしていません。)
答え1
言及したように、厳密にバイナリに保つ方が良い考えでしょう。ここ bbe
作業のためのツールのようです。次のコマンドは、ゼロパディングされたデジタルファイルにJPEGを書き込みます。
bbe -s -b '/\xff\xd8/:/\xff\xd9/' -e 'w %05B.jpg' > /dev/null
答え2
未テスト
awk '
/ff d8/ || ($2 == "d8" && ff_prevline) {p = 1}
p {print}
/ff d9/ || ($2 == "d9" && ff_prevline) {p = 0}
{ff_prevline = ($NF == "ff")}
'
答え3
1つの方法はを使用することです。行番号の間と行番号のないバイト範囲のみをperl
出力します。ff 8d
ff 9d
次のデータは次のとおりですinfile
。
0010400 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 01
0010410 00 01 00 00 ff fe 00 3c 43 52 45 41 54 4f 52 3a
0030f50 3e e9 fb a4 54 37 70 7f cb 55 03 fd af f1 a2 32
0030f60 e8 26 8f ff d9 00 00 00 00 00 00 00 00 00 00 00
次のperl
行を実行してください。
perl -ne '
if ( (my $start = m/ff\sd8/) .. (my $end = m/ff\sd9/) ) {
s/\S*\s//;
s/\A.*(?=ff\sd8)// if $start;
s/(?<=ff\sd9).*\Z// if $end;
print
}
' infile
これにより、次の出力が提供されます。
ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 01
00 01 00 00 ff fe 00 3c 43 52 45 41 54 4f 52 3a
3e e9 fb a4 54 37 70 7f cb 55 03 fd af f1 a2 32
e8 26 8f ff d9