.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の使用に時間がかかりすぎています。
パイピングzcat
の出力をhead -n 1
は、最初の行を表示するのに十分であることが保証されている少量のデータを解凍しますが、通常は、バッファーフルが数個以下(実験では96 KiB)です。
zcat logfile.gz | head -n 1
head
が1行の読み取りを完了すると、入力を閉じてパイプを閉じ、zcat
はSIGPIPE
を受け取った後に停止します(これは、次に書き込みを行おうとしたときに発生します)閉じたパイプ)。実行するとこれを確認できます
(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
を使用する必要がある場合があります。)
フィードするデータの量をzcat
(またはgzip -dc
)、次に最初の行を要求します。
head -c 1000 logfile.gz | zcat 2>/dev/null | head -1 | read logdate otherstuff
1000
それでも最初の行全体を取得するのに十分なデータが収集されない場合。
Zipファイルの1行目の日付と一致させるには-zgrep
ソリューション:
zgrep -m1 -o '^[^[:space:]]*' logfile.gz
これにより、最初のYYYY-MM-DD
が出力されます。
ファイルを解凍せずに最初の行だけが必要な場合:
gunzip -c logfile.gz | awk 'NR==1 {print; exit}'
これは、圧縮データを解凍せずに標準出力に送信し、awk
は最初の行のみを印刷します。