Regex 跨多个日志文件查找模式?

Regex 跨多个日志文件查找模式?,regex,linux,bash,shell,unix,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] *

我有以下格式的八个日志文件:

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]***标记***和[Tue Feb 24 07:40:38 2015]***标记***与log02中的任何内容都不对应,因此这不是一个全局问题,可以忽略。日志02中的日志条目[Wed Feb 25 07:01:39 2015]***标记***和[Wed Feb 25 21:17:08 2015]***标记***也可以忽略

然而,日志01中的条目[Wed Feb 25 19:10:36 2015]***标记***和日志02中的条目[Wed Feb 25 19:10:47 2015]***标记***在一分钟之内,因此这表明一个全球性问题持续到日志01中的条目[Wed Feb 25 19:15:05 2015]***标记***和日志02中的条目[Wed Feb 25 19:14:38 2015]***标记***。因此,我可以得出结论,从2月25日19:10到19:15左右,出现了一些问题


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

您可以尝试以下方法:

#!/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
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
命令awk-F''{print$4;}'log01 | cut-c1-5从log01文件中提取小时hh:mm。 grep-q$n log02搜索此小时,如果发现,则报告错误。
我认为最好的方法是使用Perl读取所有文件并创建一个列表数组。第一个数组将按四舍五入到最接近的分钟的时间进行索引,如果从file01读取,则在给定时间将1推到列表上,如果从file02读取,则将2推到列表上。最后,您将遍历第一个数组,查找长度大于1的列表。Perl标记可能会有所帮助

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

步骤1:选择一个早于您想要的最早时间的开始时间

步骤2:解析每个文件,每分钟输出一行输入数据。该行为0或1,具体取决于是否存在问题。每分钟一行可确保所有文件在所有8个文件中都与该分钟相匹配

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

#!/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
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的行。

S.O.不是免费的编码服务。您需要尝试解决您的问题,我们将帮助您解决问题。祝你好运。你如何检测问题的结束时间?Sheller:我不想让任何人免费编写任何代码。由于日期格式,我不确定是否有可能,所以我希望能就如何处理这个问题提出建议。试图为他人描述一个问题会让你的想法有所不同,这有时会揭示解决方案。Mark Setchell:如果所有日志文件都有一个彼此相隔不到一分钟的条目,则会检测到问题,只要此模式停止,问题就结束了,而结束时间将是模式持续时的最新时间,例如,我的问题中的Wed Feb 25 19:15:05 2015。其他6个日志文件如何?如果grep-q$n log02&&grep-q$n log03&&…?嗯,如果在给定时间内log01中没有问题,您将不会查看其他日志,所以其他7个可能都有问题,你永远也找不到。也许OP必须解释这类事情。可能有很多你我都不知道的变量。对于我来说,起点似乎是一个有用的答案。杰拉:谢谢你的建议。日志文件需要按日期分割,但这没有问题。但是,问题可能不会首先出现在log01中。第一个条目可能在log06中,但如果在一分钟内在所有其他日志文件中创建了一个条目,则会发生全局问题。