.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
head
1行を読んだ後、入力を閉じてパイプを閉じてzcat
aを受け取り、それを停止しますSIGPIPE
(これは次に閉じたパイプに書き込もうとしたときに発生します)。これを実行すると見ることができます
(zcat logfile.gz; echo $? >&2) | head -n 1
(13 + 128)が原因で停止したことをzcat
示すコード141で終了します。SIGPIPE
後処理をさらに追加できます。例えばAWKを使用して日付のみを抽出します。
zcat logfile.gz | awk '{ print $1; exit }'
gzcat
(macOSでは処理する代わりにzcat
gzip圧縮を使用することもできます。)
答え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
最初の行のみを印刷します。