我有一个应用程序,它会非常仓促地删除日志。它在日志中保留了大约10,000行,并且由于内部程序员同时不可配置。新的传入条目,将最底层的条目从日志中推出。
所以,我有一个cron作业,它每小时拍摄一次日志文件的快照。在快速交易时间内,日志与前一个日志重叠不到一千行,但在缓慢的时间内,有5-7千行重叠。
我的目的是将日志重建为一个大日志,其中每个行只存在一个实例。我目前获得这样一个结果的方法是,通过最新日志文件中的每一行并将其与前一个文件中的所有行进行比较,如果它不存在,则将其附加到单个日志文件中。但对于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
编辑:我已经用更好的格式化输入和上面的结果输出文件表示更新了我想要完成的结果。
为了使事情变得更难,此日志文件没有时间戳。去图......虽然它不是非常的,但是知道发生了什么事情会很好,但是日志的目的不再是时机。它只是捕捉错误及其频率。
所以,这是一个正则表达式的问题,我肯定,但它们不是我的强项,我不知道如何捕捉跨越多行的模式,当我说多个时,它是数百或者thopusands的行。
答案 0 :(得分:1)
awk 'NR==FNR {print; seen[$0]=1; next} !($0 in seen)' file1 file2
这会读取,打印并存储file1中的行(“NR == FNR”条件),然后,对于file2,只有在file1中没有看到它时才打印该行
鉴于您的更新,这可以更加通用:
awk '! seen[$0]++' log1 log2 ...
这可能会占用大量内存,具体取决于文件的大小。它必须存储所有唯一的行,以及使用关联数组的任何开销。
此外,如果单个文件包含重复的行,则只输出第一行。
答案 1 :(得分:0)
使用uniq
执行此操作的另一种方法cat file1.txt file2.txt | sort | uniq > bigFile.txt