gzip: kết thúc tệp không mong muốn bằng - cách đọc tệp nào


9

Tôi có một công việc trên một hệ thống hàng loạt chạy rất dài và tạo ra hàng tấn đầu ra. Thực tế là tôi phải chuyển đầu ra tiêu chuẩn thông qua gzip để giữ cho nút hàng loạt không lấp đầy vùng làm việc của nó và sau đó bị sập.

longscript | gzip -9 > log.gz

Bây giờ, tôi muốn điều tra đầu ra của công việc trong khi nó vẫn đang chạy. Vì vậy, tôi làm điều này:

gunzip log.gz

Điều này chạy rất lâu, vì nó là tệp rất lớn (vài GB). Tôi có thể thấy tệp đầu ra đang được tạo trong khi nó đang chạy và có thể xem nó trong khi nó đang được xây dựng.

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

Tuy nhiên, cuối cùng, gzip gặp phải phần cuối của tệp được nén. Vì công việc vẫn đang chạy và gzip vẫn đang ghi tệp, nên chưa có chân trang phù hợp, vì vậy điều này xảy ra:

gzip: log.gz: unexpected end of file

Sau này, tệp nhật ký trích xuất bị xóa, vì gzip nghĩ rằng dữ liệu trích xuất bị hỏng là không có ích với tôi. Tôi, tuy nhiên, không đồng ý - ngay cả khi một vài dòng cuối cùng được xáo trộn, đầu ra vẫn rất thú vị đối với tôi.

Làm cách nào tôi có thể thuyết phục gzip để cho tôi giữ tệp "bị hỏng"?


gunzip -cghi đầu ra vào thiết bị xuất chuẩn ... có thể đó là những gì bạn đang tìm kiếm? Nó giữ nguyên bản không thay đổi.
Anh

Câu trả lời:


5

Ngoài phần cuối của tệp, bạn sẽ có thể thấy dữ liệu không nén với zcat(hoặc gzip -dc, hoặc gunzip -c):

zcat log.gz | tail

hoặc là

zcat log.gz | less

hoặc là

zless log.gz

gzipsẽ thực hiện đệm vì những lý do rõ ràng (cần nén dữ liệu theo từng khối), do đó, mặc dù chương trình có thể đã xuất ra một số dữ liệu, dữ liệu đó có thể chưa có trong log.gztệp.

Bạn cũng có thể lưu trữ nhật ký không nén với

zcat log.gz > log

... nhưng điều đó thật ngớ ngẩn vì rõ ràng có một lý do tại sao bạn nén đầu ra ngay từ đầu.


1
Xem gunzip < log.gzthay vì các zcat log.gzhệ thống zcatchỉ hoạt động trong .Zcác tệp.
Stéphane Chazelas

1

Nếu tôi hiểu chính xác, bạn muốn làm một cái gì đó giống như tail -fvới tệp gzip vẫn đang phát triển: Tôi đã phát triển gztool có thể làm điều đó (trong số những thứ khác):

$ gztool -T log.gz

và nó sẽ xuất ra giao diện điều khiển liên tục, chờ dữ liệu mới khi cần thiết.

Lưu ý rằng gztoolcũng sẽ tạo một tệp chỉ mục ( log.gzitrong trường hợp này) sẽ tạo ra các đuôi trong tương lai hoặc các truy cập ngẫu nhiên khác vào dữ liệu gzip gztoolgần như tức thời. Nếu bạn không muốn tạo chỉ mục (mặc dù kích thước 0,3% / gzip và không tăng thời gian xử lý), bạn có thể sử dụng -Wđể không tạo chỉ mục.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.