让我们考虑这个测试文件:
$ cat file.log
127894 2020-07-30 22:04:30.234124 foobar caught an unknown exception
127895 2020-07-30 22:05:20.424134 foobar clearing the programs cache
127895 2020-07-30 22:05:30.424134 foobar clearing the programs cache
127895 2020-07-30 22:05:40.424134 foobar clearing the programs cache
127896 2020-07-30 22:06:30.424134 foobar recalibrating dankness
127896 2020-07-30 22:06:40.424134 foobar recalibrating dankness
要获得最拥挤的分钟数,按顺序排列:
$ awk '{sub(/:[^:]*$/, "", $3); a[$2" "$3]++} END{for (d in a)print a[d], d}' file.log | sort -nr
3 2020-07-30 22:05
2 2020-07-30 22:06
1 2020-07-30 22:04
22:05 在日志文件中出现了 3 次,因此是最拥塞的,其次是 22:06。
要仅获取最拥挤的分钟数,请添加head
. 例如:
$ awk '{sub(/:[^:]*$/, "", $3); a[$2" "$3]++} END{for (d in a)print a[d], d}' file.log | sort -nr | head -1
3 2020-07-30 22:05
注意我们这里是根据第二个和第三个字段来选择的。日志消息文本中日期或时间的存在不会混淆此代码。
这个怎么运作
sub(/:[^:]*$/, "", $3)
在第三场几分钟后删除所有内容。
a[$2" "$3]++
计算日期和时间(最多分钟)出现的次数。
读取整个文件后,for (d in a)print a[d], d
打印出每个观察日期的计数和日期。
sort -nr
将计数最高的输出排序在顶部。(或者,我们可以让 awk 进行排序,但sort -nr
它简单且可移植。)
排序到第二个
我们可以得到秒分辨率,而不是分钟分辨率:
$ awk '{sub(/\.[^.]*$/, "", $3); a[$2" "$3]++} END{for (d in a)print a[d], d}' file.log | sort -nr
1 2020-07-30 22:06:40
1 2020-07-30 22:06:30
1 2020-07-30 22:05:40
1 2020-07-30 22:05:30
1 2020-07-30 22:05:20
1 2020-07-30 22:04:30