圧縮されたテキストファイルの最後の数行を解凍して印刷する方法は?

圧縮されたテキストファイルの最後の数行を解凍して印刷する方法は?

6つのgzip圧縮テキストファイルがあり、各ファイルの圧縮サイズは約17Gです。特定の問題があるかどうかを確認するには、各ファイル(圧縮解除)の最後の数行を調べる必要があります。明らかな方法は非常に遅いです。

for i in *; do zcat "$i" | tail -n3; done

次のような巧妙なことができると思いました。

for i in *; do tail -n 30 "$i" | gunzip | tail -n 4 ; done

または

for i in *; do tac "$i" | head -100 | gunzip | tac | tail -n3; done

しかし、どちらも次のように文句を言いました。

gzip: stdin: not in gzip format

ヘッダーがないので、そういうことがわかりましたが、gzipこれも失敗しました。

$ aa=$(head -c 300 file.gz)
$ bb=$(tail -c 300 file.gz)
$ printf '%s%s' "$aa" "$bb" | gunzip
gzip: stdin: unexpected end of file

私が本当に探しているのはztailztacしかし私はそれが存在しないと思います。ファイル全体を解凍せずに圧縮ファイルの最後の数行を解凍して印刷できる巧妙なトリックを考案できる人はいますか?

答え1

それのせいで君はできないすでに言った、ファイルが既に標準を使用している場合、gzip圧縮を制御できる場合は、次を使用できます。dictzipファイルを圧縮するには、ファイルを別のチャンクに圧縮します。最後のチャンク(通常64KB)のみを解凍できます。そして以前のバージョンと互換性がありますgzip。つまり、dictzip圧縮ファイルも完全に正当なgzip圧縮ファイルであることを意味します。

もう1つの可能性は、複数のgzipファイルをリンクしてgzipファイルを取得した場合は、最後のgzip署名を検索し、それ以降のすべてのコンテンツを解凍できることです。

答え2

素晴らしい、あなたはできます以前に作成した場合は、gzip圧縮ファイルへのランダムアクセス索引各ファイルごとに...

私はあなたが探しているコマンドラインツールを開発しました。このツールはgunzipと同じ時間内に尾にアクセスできますが、小さい(<<1%/ gzip)インデックスを生成するため次の抽出は非常に高速です。:

https://github.com/circulosmeos/gztool

このツールには、あなたが興味を持つことができる2つのオプションがあります。

  • -Sオプションは、増え続けるファイルを監視し、増えるにつれてそれにインデックスを付けます。これは実際にインデックスを作成する時間をゼロに短縮するため、gzipで圧縮されたrsyslogファイルに役立ちます。
  • -ティーgzipファイルを追跡します。次のことができます。$ gztool -t foo.gz インデックスが存在しない場合、完全な解凍と同じ時間がかかります。ただし、インデックスを再利用できるため、次の検索にははるかに少ない時間がかかります。同時に使用して同時にインデックスを作成するのはどうですか?

このツールは以下に基づいています。元のzlibのzran.cデモコードだから、ルールに従わない魔法はありません!

関連情報