ファイル全体を解凍せずに.gz圧縮ファイルの最初の行を読みます。

ファイル全体を解凍せずに.gz圧縮ファイルの最初の行を読みます。

.gz形式で圧縮された大容量ログファイルがありますが、解凍せずにファイルの最初の行を読み、ファイル内の最も古いログの日付のみを確認したいと思います。

ログ形式は次のとおりです。

YYYY-MM-DD Log content asnsenfvwen eaifnesinrng
YYYY-MM-DD Log content asnsenfvwen eaifnesinrng
YYYY-MM-DD Log content asnsenfvwen eaifnesinrng

最初の行の日付だけを読みたいです。圧縮されていないファイルの場合は、次のようにします。

read logdate otherstuff < logfile.gz
echo $logdate

zcatを使用すると時間がかかりすぎます。

ベストアンサー1

Pipingzcatの出力は、head -n 1最初の行を表示するのに十分であることを保証する少量のデータ圧縮を解きますが、一般的にいっぱいのバッファ数はいくつか(私の実験では96KiB)を超えません。

zcat logfile.gz | head -n 1

head1行を読んだ後、入力を閉じてパイプを閉じてzcataを受け取り、それを停止しますSIGPIPE(これは次に閉じたパイプに書き込もうとしたときに発生します)。これを実行すると見ることができます

(zcat logfile.gz; echo $? >&2) | head -n 1

(13 + 128)が原因で停止したことをzcat示すコード141で終了します。SIGPIPE

後処理をさらに追加できます。例えばAWKを使用して日付のみを抽出します。

zcat logfile.gz | awk '{ print $1; exit }'

gzcat(macOSでは処理する代わりにzcatgzip圧縮を使用することもできます。)

おすすめ記事