【问题标题】:consolidating overlapping log files合并重叠的日志文件
【发布时间】:2014-05-06 19:08:07
【问题描述】:

我有一个应用程序可以非常仓促地删除日志。它在日志中保留了大约 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

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

为了让事情变得更难,这个日志文件没有时间戳。去图......虽然它并不重要,但很高兴知道什么时候发生了什么,但再次记录的目的不是时间。它只是捕捉错误及其频率。

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

【问题讨论】:

  • 您想避免对输入文件进行排序吗?
  • 对输入文件进行排序会打乱事件发生的顺序。尽管我不太想知道什么时候发生的事情,到那一刻,我仍然想知道相对于另一个事件在什么时间发生了什么,以确定因果关系。此外,我的日志条目不是一个衬里。一个甚至可以在日志中生成多达 15 行左右的条目,这只有在您将日志作为一个整体而不是一次查看一行时才有意义。因此,正如我在下面的第一个答案中提到的,排序不是一种选择。

标签: regex shell unix logging


【解决方案1】:
awk 'NR==FNR {print; seen[$0]=1; next} !($0 in seen)' file1 file2 

这会读取、打印和存储 file1 中的行(“NR==FNR”条件),然后,对于 file2,它只会打印在 file1 中没有看到的行


鉴于您的更新,这可以更笼统:

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

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

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

【讨论】:

  • 当我尝试运行你的一个班轮时,我收到这些错误--> awk: 第 1 行附近的语法错误; awk:在 1 号线附近救援
  • @Scott - 我测试了 glenn 的解决方案,它在这里工作得很好。它可能与您作为参数传递的文件名有关。
  • 我运行的命令是 awk 'NR==FNR {print;见过[$0]=1; next} !($0 in seen)' log1 log2 我收到了我之前写的错误消息。请在原始问题中查看我更新的文件表示形式,了解 log1 和 log2 内容
  • hmmm 奇怪.. 当我在 solaris 9 机器上时,awk 命令不起作用,但在 red hat 5 系统上工作正常。它在文件边界处吐出一个无关紧要的空白行,但如果迫在眉睫,我可以用 grep 将其取出。暂时,我已经准备好了。谢谢格伦
  • 在 Solaris 上,“默认”/usr/bin/awk 被认为是旧的和损坏的。请改用/usr/xpg4/bin/awknawk
【解决方案2】:

使用 uniq 的另一种方法

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

【讨论】:

  • 要是这么简单就好了。我想保持日志的时间顺序,即使时间不是我主要关心的问题,我仍然需要知道相对于另一个事件发生了什么。此外,日志条目不仅在一行中。
猜你喜欢
  • 1970-01-01
  • 2021-10-11
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
相关资源
最近更新 更多