查找多个日志文件中的模式?

时间:2015-03-01 03:38:08

标签: regex linux bash shell unix

我有八种日志文件,格式如下:

log01:

[Tue Feb 24 07:39:37 2015] *** MARK ***
[Tue Feb 24 07:40:38 2015] *** MARK ***
[Wed Feb 25 17:13:33 2015] *** MARK ***
[Wed Feb 25 17:14:09 2015] *** MARK ***
[Wed Feb 25 17:16:46 2015] *** MARK ***
[Wed Feb 25 17:17:48 2015] *** MARK ***
[Wed Feb 25 17:22:31 2015] *** MARK ***
[Wed Feb 25 19:10:36 2015] *** MARK ***
[Wed Feb 25 19:10:52 2015] *** MARK ***
[Wed Feb 25 19:11:08 2015] *** MARK ***
[Wed Feb 25 19:11:34 2015] *** MARK ***
[Wed Feb 25 19:12:00 2015] *** MARK ***
[Wed Feb 25 19:12:26 2015] *** MARK ***
[Wed Feb 25 19:13:17 2015] *** MARK ***
[Wed Feb 25 19:13:33 2015] *** MARK ***
[Wed Feb 25 19:15:05 2015] *** MARK ***
[Wed Feb 25 19:37:53 2015] *** MARK ***
[Wed Feb 25 19:38:19 2015] *** MARK ***
[Wed Feb 25 19:38:35 2015] *** MARK ***
[Wed Feb 25 23:08:47 2015] *** MARK ***
[Wed Feb 25 23:09:28 2015] *** MARK ***
[Wed Feb 25 23:11:55 2015] *** MARK ***
[Wed Feb 25 23:12:21 2015] *** MARK ***
[Wed Feb 25 23:12:52 2015] *** MARK ***
[Wed Feb 25 23:13:08 2015] *** MARK ***
...

log02:

[Wed Feb 25 07:01:39 2015] *** MARK ***
[Wed Feb 25 17:13:49 2015] *** MARK ***
[Wed Feb 25 17:15:20 2015] *** MARK ***
[Wed Feb 25 17:16:47 2015] *** MARK ***
[Wed Feb 25 17:17:38 2015] *** MARK ***
[Wed Feb 25 17:19:56 2015] *** MARK ***
[Wed Feb 25 17:22:53 2015] *** MARK ***
[Wed Feb 25 19:10:47 2015] *** MARK ***
[Wed Feb 25 19:11:13 2015] *** MARK ***
[Wed Feb 25 19:11:34 2015] *** MARK ***
[Wed Feb 25 19:11:50 2015] *** MARK ***
[Wed Feb 25 19:12:11 2015] *** MARK ***
[Wed Feb 25 19:12:37 2015] *** MARK ***
[Wed Feb 25 19:12:53 2015] *** MARK ***
[Wed Feb 25 19:13:14 2015] *** MARK ***
[Wed Feb 25 19:13:40 2015] *** MARK ***
[Wed Feb 25 19:14:06 2015] *** MARK ***
[Wed Feb 25 19:14:22 2015] *** MARK ***
[Wed Feb 25 19:14:38 2015] *** MARK ***
[Wed Feb 25 19:38:30 2015] *** MARK ***
[Wed Feb 25 21:17:08 2015] *** MARK ***
[Wed Feb 25 23:08:56 2015] *** MARK ***
[Wed Feb 25 23:10:37 2015] *** MARK ***
[Wed Feb 25 23:11:08 2015] *** MARK ***
[Wed Feb 25 23:11:24 2015] *** MARK ***
[Wed Feb 25 23:12:20 2015] *** MARK ***
[Wed Feb 25 23:12:46 2015] *** MARK ***
...

每个日志文件都是由读取不同传感器的同一程序的实例生成的。如果传感器检测到问题,则会创建日志条目。如果每个传感器在大约一分钟内检测到问题,则表示发生了全局问题。例如:

log01中的日志条目[Tue Feb 24 07:39:37 2015] *** MARK ***[Tue Feb 24 07:40:38 2015] *** MARK ***与log02中的任何内容都不对应,因此这不是全局问题,可以忽略。 log02中的日志条目[Wed Feb 25 07:01:39 2015] *** MARK ***[Wed Feb 25 21:17:08 2015] *** MARK ***也可以忽略。

但是,log01中的条目[Wed Feb 25 19:10:36 2015] *** MARK ***和log02中的[Wed Feb 25 19:10:47 2015] *** MARK ***在一分钟之内,因此这表示一直存在全局问题,直到log01中的条目[Wed Feb 25 19:15:05 2015] *** MARK ***和log02中的[Wed Feb 25 19:14:38 2015] *** MARK *** 。所以我可以得出结论,从2月25日19:10到19:15,出了点问题。

我正在寻找有关如何解决此问题的建议和提示,最好是使用UNIX实用程序。

2 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

#!/bin/bash

for n in $(awk -F' ' '{print $4;}' log01 | cut -c1-5)
do
    if (grep -q $n log02)
    then
        echo "Error on $n"
    fi
done
  • 命令awk -F' ' '{print $4;}' log01 | cut -c1-5hh:mm文件中提取小时(log01)。
  • grep -q $n log02搜索此小时,如果找到则报告和错误。

答案 1 :(得分:0)

我认为优雅的方法是使用Perl读取所有文件并创建一个列表数组。第一个数组将被四舍五入到最近分钟的时间编入索引,如果您从1file01读取,则会在给定时间将2推送到列表中你是从file02读的。然后在最后,您将遍历第一个数组,查找长度大于1的列表。 Perl标记可能有帮助。

如果你不喜欢Perl,你可以把一些更笨拙的东西放在一起,就像这样。

步骤1:选择比您想要的最早时间早的开始时间。

步骤2:解析每个文件,每分钟输出一行输入数据。根据是否存在问题,该行为0或1。每分钟一行确保所有文件排队匹配所有8个分钟。

步骤3:使用paste将所有8个输出文件放在一起,如下所示:

paste -d, file{1..8}

1,0,1,1,1,0,1,1
1,1,1,1,1,1,1,1
0,0,1,1,0,0,0,1
0,1,1,1,0,1,0,1
0,0,1,1,0,0,0,1
0,1,1,1,0,1,0,1
1,0,1,1,1,0,1,1
1,1,1,1,1,1,1,1

第4步:使用awk查找加起来超过1的行。