gzip: akhir file yang tak terduga dengan - cara membaca file


9

Saya memiliki pekerjaan pada sistem batch yang berjalan sangat lama dan menghasilkan banyak output. Sebenarnya saya harus mem-pipe output standar melalui gzip untuk menjaga agar batch batch tidak mengisi area kerjanya dan kemudian crash.

longscript | gzip -9 > log.gz

Sekarang, saya ingin menyelidiki output dari pekerjaan saat ini masih berjalan. Jadi saya melakukan ini:

gunzip log.gz

Ini berjalan sangat lama, karena ini adalah file besar (beberapa GB). Saya bisa melihat file output sedang dibuat saat sedang berjalan dan bisa melihatnya saat sedang dibangun.

tail log
> some-line-of-the-log-file
tail log
> some-other-line-of-the-log-file

Namun, pada akhirnya, gzip menemukan akhir file gzip. Karena pekerjaan masih berjalan dan gzip masih menulis file, belum ada footer yang tepat, jadi ini terjadi:

gzip: log.gz: unexpected end of file

Setelah ini, file log yang diekstraksi dihapus, karena gzip berpikir bahwa data yang diekstrak yang rusak tidak ada gunanya bagiku. Saya, bagaimanapun, tidak setuju - bahkan jika beberapa baris terakhir diacak, hasilnya masih sangat menarik bagi saya.

Bagaimana saya bisa meyakinkan gzip untuk membiarkan saya menyimpan file "rusak"?


gunzip -cmenulis output ke stdout ... mungkin itu yang Anda cari? Itu membuat aslinya tidak berubah.
bretonics

Jawaban:


5

Terlepas dari bagian paling akhir file, Anda akan dapat melihat data yang tidak terkompresi dengan zcat(atau gzip -dc, atau gunzip -c):

zcat log.gz | tail

atau

zcat log.gz | less

atau

zless log.gz

gzipakan melakukan buffering untuk alasan yang jelas (perlu mengompres data dalam potongan), jadi meskipun program mungkin telah mengeluarkan beberapa data, data tersebut mungkin belum ada dalam log.gzfile.

Anda juga dapat menyimpan log yang tidak dikompresi

zcat log.gz > log

... tapi itu akan konyol karena jelas ada alasan mengapa Anda memampatkan output di tempat pertama.


1
Lihat gunzip < log.gzalih-alih zcat log.gzuntuk sistem yang zcathanya berfungsi dalam .Zfile.
Stéphane Chazelas

1

Jika saya mengerti dengan benar, Anda ingin melakukan sesuatu seperti tail -fdengan file gzip yang masih tumbuh: Saya telah mengembangkan gztool yang dapat melakukan itu (antara lain):

$ gztool -T log.gz

dan itu akan ditampilkan ke konsol terus menerus, menunggu data baru ketika diperlukan.

Catatan yang gztooljuga akan membuat file indeks ( log.gzidalam hal ini) yang akan membuat ekor masa depan atau akses acak lainnya ke data gzip dengan gztoolhampir seketika. Jika Anda tidak ingin membuat indeks (meskipun ukurannya 0,3% / gzip dan tidak menambah waktu pemrosesan), Anda dapat menggunakannya -Wuntuk tidak membuatnya.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.