繁体   English   中英

合并重叠的日志文件

[英]consolidating overlapping log files

我有一个非常仓促地删除日志的应用程序。 由于一次由内部编程人员完成,因此它在日志中保留了大约10,000行,并且它是不可配置的。 新输入条目,将最底端的条目推出日志。

因此,我有一个cron作业,它每小时都会对日志文件进行快照。 在快速交易时间,日志与前一个日志重叠不到一千行,而在慢速交易时间,则有5-7 000行重叠。

我的目的是将日志重构为一个大日志,其中每行只有一个实例。 我目前获得这种结果的方法是,遍历最新日志文件中的每一行,并将其与上一个文件中的所有行进行比较,如果不存在,请将其附加到单个日志文件中。 但是对于5-7K的行来说,这是一个冗长的过程,是否有工具或方法来发现文件的重叠部分,例如:

log1    log2    log3          Resulting File

1111 ........................ 1111
x1x1 ........................ x1x1
2222 ........................ 2222
3333 ........................ 3333
4444 ........................ 4444
5555 ........................ 5555
6666    6666 ................ 6666
7777    7777 ................ 7777
8888    8888 ................ 8888
        9999 ................ 9999
        aaaa ................ aaaa
        bbbb ................ bbbb
        cccc    cccc ........ cccc
        y1y1    y1y1 ........ y1y1
        dddd    dddd ........ dddd
                eeee ........ eeee
                z1z1 ........ z1z1
                ffff ........ ffff
                gggg ........ gggg

编辑:我已经更新了我想要用更好的格式化输入和结果输出文件表示形式完成的结果。

更麻烦的是,此日志文件没有时间戳。 看图...虽然不是紧要关头,但很高兴知道什么时候发生了什么,但是再次,日志的目的不是计时。 它只是捕获错误及其发生频率。

因此,我确定这是一个正则表达式问题,但它们并不是我的强项,我也不知道如何捕获跨越多行的模式,当我说多行时,它是数百行或四倍的行数。

awk 'NR==FNR {print; seen[$0]=1; next} !($0 in seen)' file1 file2 

这将读取,打印并将行存储在file1中(“ NR == FNR”条件),然后,对于file2,仅当在file1中未看到行时才打印该行


有了您的更新,可以使其更加通用:

awk '! seen[$0]++' log1 log2 ...

这可能会占用大量内存,具体取决于文件的大小。 它必须存储所有唯一的行,以及使用关联数组的所有开销。

另外,如果单个文件包含重复的行,则仅输出第一行。

使用uniq的另一种方法

cat file1.txt file2.txt | sort | uniq > bigFile.txt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM