Gzip
合併可能截斷的 gzip 日誌文件
我每天都有多個日誌文件需要合併在一起。每個都來自不同的伺服器。將它們放在那裡的工作有時會中斷,文件會被截斷。在這種情況下,文件下次執行時會使用不同的名稱寫入。所以我最終可能會得到一個日誌文件列表,例如:
server-1-log.gz
(昨天的日誌文件)server-1-log.1.gz
(今天的日誌文件在傳輸時被中斷並被截斷)server-1-log.2.gz
(今天的日誌文件重新傳輸並完好無損)server-2-log.gz
(昨天的日誌文件)server-2-log.1.gz
(今天的日誌文件)所有日誌文件都以每行的時間戳開頭,因此對它們進行排序和去重是相當簡單的。我一直在嘗試使用以下命令合併這些文件:
zcat *.gz | sort | uniq | gzip > /tmp/merged.gz
問題是截斷的日誌文件產生以下錯誤
zcat
:gzip:server-1-log.1.gz:文件意外結束
事實證明,zcat 在遇到此錯誤時會完全退出,而不會從其他文件中讀取所有數據。我最終失去了其他好文件中存在的數據,因為其中一個文件已損壞。我怎樣才能解決這個問題?
- 我可以告訴
zcat
不要退出錯誤嗎?我在手冊頁中沒有看到任何內容。- 我可以在呼叫之前修復截斷的 gzip 文件
zcat
嗎?- 我可以使用不同的解壓程序嗎?
我猜你正在
gzip
使用zcat
. 那隻是執行gzip -dc
,不能被告知忽略錯誤並在遇到錯誤時停止。針對單個損壞的壓縮文件的記錄修復是執行它們
zcat
,因此您不會在那裡獲得太多幫助……要處理您的文件,您可以循環它們(使用
for
循環或xargs
您找到的),或者使用Zutils,它的版本zcat
在遇到錯誤時會繼續處理。
我找到了一種方法。我可以通過每個文件自己的
zcat
. 為此,我可以使用xargs -n 1
為每個文件啟動一個 zcat 實例:echo *.gz | xargs -n 1 zcat | sort | uniq | gzip > /tmp/merged.gz
單個 zcat 仍然失敗,但其他 zcat 執行完成。它不會殺死整個管道。