如何通过Bash命令提取log.txt相对备份文件的新增内容?
结论
完全可以用Bash原生命令实现,针对日志只追加不修改历史内容的特性,有两个靠谱方案,按需选择即可。
方案1:按行号截取(速度最快,适合纯追加、未改动过历史内容的场景)
- 逻辑很简单:备份生成时和当时的log.txt内容完全一致,只要备份生成后没有修改、删除过log.txt里的旧内容,没有乱调整过换行格式,那备份文件的总行数,就对应备份那一刻log.txt的截止行号,直接把这行之后的内容摘出来就是新增部分。
- 执行以下命令即可:
bak_lines=$(wc -l < log.bak2022.06.20.10.00.txt) tail -n +$((bak_lines + 1)) log.txt > log_added.txt
- 优缺点:哪怕是几十GB的大体积日志也能秒级出结果,资源占用极低;但如果之前改动过log.txt的历史内容,行号错位会导致提取内容不准。
方案2:按内容差异提取(容错性更高,适合历史内容可能有小改动的场景)
- 逻辑:通过diff工具逐段比对两个文件的内容,只输出当前log.txt比备份文件多出的内容段,不会附带diff自带的差异标记。
- 执行命令:
diff --changed-group-format='%>' --unchanged-group-format='' log.bak2022.06.20.10.00.txt log.txt > log_added.txt
- 优缺点:不要求历史内容完全一致,哪怕备份生成后调整过少量历史行的字符、修正过换行格式,只要日志整体写入顺序不变,就能准确提取最后追加的新增内容;缺点是超大文件下执行速度比方案1慢,日常使用基本感知不到差异。
提取完成后建议先校验结果,比如执行
head log_added.txt查看前几行的日志时间,确认都是2022年6月20日10:00之后生成的内容即可。
内容的提问来源于stack exchange,提问作者user7693832
相关产品推荐
相关产品推荐

