web-dev-qa-db-ja.com

ファイル全体を解凍せずに.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の使用に時間がかかりすぎています。

9
Pratik Mayekar

パイピングzcatの出力をhead -n 1は、最初の行を表示するのに十分であることが保証されている少量のデータを解凍しますが、通常は、バッファーフルが数個以下(実験では96 KiB)です。

zcat logfile.gz | head -n 1

headが1行の読み取りを完了すると、入力を閉じてパイプを閉じ、zcatSIGPIPEを受け取った後に停止します(これは、次に書き込みを行おうとしたときに発生します)閉じたパイプ)。実行するとこれを確認できます

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

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

後処理e.g。をAWKで追加して、日付のみを抽出できます。

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

(macOSでは、gzip圧縮されたファイルを処理するためにgzcatではなくzcatを使用する必要がある場合があります。)

20
Stephen Kitt

フィードするデータの量をzcat(またはgzip -dc)、次に最初の行を要求します。

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

1000それでも最初の行全体を取得するのに十分なデータが収集されない場合。

4
Jeff Schaller

Zipファイルの1行目の日付と一致させるには-zgrepソリューション:

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

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

3
RomanPerekhrest

ファイルを解凍せずに最初の行だけが必要な場合:

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

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

1
Nasir Riley