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
私が本当に探しているのはztail
、ztac
しかし私はそれが存在しないと思います。ファイル全体を解凍せずに圧縮ファイルの最後の数行を解凍して印刷できる巧妙なトリックを考案できる人はいますか?
答え1
答え2
素晴らしい、あなたはできます以前に作成した場合は、gzip圧縮ファイルへのランダムアクセス索引各ファイルごとに...
私はあなたが探しているコマンドラインツールを開発しました。このツールはgunzipと同じ時間内に尾にアクセスできますが、小さい(<<1%/ gzip)インデックスを生成するため次の抽出は非常に高速です。:
https://github.com/circulosmeos/gztool
このツールには、あなたが興味を持つことができる2つのオプションがあります。
- -Sオプションは、増え続けるファイルを監視し、増えるにつれてそれにインデックスを付けます。これは実際にインデックスを作成する時間をゼロに短縮するため、gzipで圧縮されたrsyslogファイルに役立ちます。
- -ティーgzipファイルを追跡します。次のことができます。
$ gztool -t foo.gz
インデックスが存在しない場合、完全な解凍と同じ時間がかかります。ただし、インデックスを再利用できるため、次の検索にははるかに少ない時間がかかります。同時に使用して同時にインデックスを作成するのはどうですか?
このツールは以下に基づいています。元のzlibのzran.cデモコードだから、ルールに従わない魔法はありません!