ファイル全体を解凍せずに.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圧縮を使用することもできます。)

答え2

zcat(or) に提供されるデータ量を制限し、gzip -dc最初の行を要求できます。

head -c 1000 logfile.gz | zcat 2>/dev/null | head -1 | read logdate otherstuff

1000最初の行全体を取得するのに十分なデータがキャプチャされない場合は、調整してください。

答え3

zipファイルの最初の行の日付のみを一致させます。zgrep回避策:

zgrep -m1 -o '^[^[:space:]]*' logfile.gz

YYYY-MM-DDこれにより、最初の結果が出力されます。

答え4

ファイルを解凍せずに最初の行だけを希望する場合:

gunzip -c logfile.gz | awk 'NR==1 {print; exit}'

これにより、圧縮データを解凍せずに標準出力に送信し、awk最初の行のみを印刷します。

関連情報