在多个日志文件中查找模式?
Find patterns across multiple log files?
我有八个日志文件,格式如下:
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 ***
和 [Wed Feb 25 19:14:38 2015] *** MARK ***
在 log02.所以我可以得出结论,从 2 月 25 日 19:10 到 19:15 左右,出了点问题。
我正在寻找有关如何解决此问题的建议和技巧,最好是使用 UNIX 实用程序。
您可以尝试这样的操作:
#!/bin/bash
for n in $(awk -F' ' '{print ;}' log01 | cut -c1-5)
do
if (grep -q $n log02)
then
echo "Error on $n"
fi
done
- 命令
awk -F' ' '{print ;}' log01 | cut -c1-5
从您的 log01
文件中提取小时 (hh:mm
)。
grep -q $n log02
搜索这个小时,如果找到就报告错误。
我认为优雅的方法是使用 Perl 读取所有文件并创建一个列表数组。第一个数组将按四舍五入到最接近的分钟的时间进行索引,如果您从 file01
读取,您将在给定时间将 1
推入列表,如果是 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 的行。
我有八个日志文件,格式如下:
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 ***
和 [Wed Feb 25 19:14:38 2015] *** MARK ***
在 log02.所以我可以得出结论,从 2 月 25 日 19:10 到 19:15 左右,出了点问题。
我正在寻找有关如何解决此问题的建议和技巧,最好是使用 UNIX 实用程序。
您可以尝试这样的操作:
#!/bin/bash
for n in $(awk -F' ' '{print ;}' log01 | cut -c1-5)
do
if (grep -q $n log02)
then
echo "Error on $n"
fi
done
- 命令
awk -F' ' '{print ;}' log01 | cut -c1-5
从您的log01
文件中提取小时 (hh:mm
)。 grep -q $n log02
搜索这个小时,如果找到就报告错误。
我认为优雅的方法是使用 Perl 读取所有文件并创建一个列表数组。第一个数组将按四舍五入到最接近的分钟的时间进行索引,如果您从 file01
读取,您将在给定时间将 1
推入列表,如果是 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 的行。