Gzip

合併可能截斷的 gzip 日誌文件

  • October 20, 2017

我每天都有多個日誌文件需要合併在一起。每個都來自不同的伺服器。將它們放在那裡的工作有時會中斷,文件會被截斷。在這種情況下,文件下次執行時會使用不同的名稱寫入。所以我最終可能會得到一個日誌文件列表,例如:

  • 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 執行完成。它不會殺死整個管道。

引用自:https://unix.stackexchange.com/questions/399369