我每天都有多个日志文件需要合并在一起。每个都来自不同的服务器。将它们放在那里的工作有时会被中断并且文件会被截断。在这种情况下,该文件下次运行时会使用不同的名称写入。所以我最终可能会得到一个日志文件列表,例如:
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
吗? - 我可以使用不同的减压程序吗?
答案1
我猜你正在使用 的gzip
脚本版本zcat
。它只是执行gzip -dc
,不能被告知忽略错误并在遇到错误时停止。
针对单个损坏的压缩文件的记录修复是运行它们zcat
,因此您不会在那里获得太多帮助......
要处理您的文件,您可以循环它们(使用循环for
或xargs
您发现的那样),或者使用祖蒂尔斯它有一个版本,zcat
当遇到错误时会继续处理。
答案2
我找到了一种方法来做到这一点。我可以通过每个文件自己的zcat
.为此,我可以xargs -n 1
为每个文件启动一个 zcat 实例:
echo *.gz | xargs -n 1 zcat | sort | uniq | gzip > /tmp/merged.gz
单个 zcat 仍然失败,但其他 zcat 运行完成。它不会杀死整个管道。