1

我有一个程序,它在运行期间会写入一个文本文件。在这个文本文件中,每一行由 4 个部分组成。

  1. 线程 ID(一个数字)
  2. 格式为 yyyy-mm-dd 的日期
  3. 格式为 12:34:56.123456 的时间戳
  4. 一个函数名
  5. 程序打印出来的一些有用的注释

日志行的示例如下所示:

127894 2020-07-30 22:04:30.234124 foobar caught an unknown exception
127895 2020-07-30 22:05:30.424134 foobar clearing the programs cache
127896 2020-07-30 22:06:30.424134 foobar recalibrating dankness

日志按时间顺序打印,我想知道如何获得这些日志的最高频率。例如,我想知道程序在一天中的哪一分钟或几秒拥塞最严重。

理想情况下,我想要一个可以告诉我的输出,例如“最高记录频率在 22:04:00 和 22:05:00 之间,在此时间范围内打印 10 条日志行”。

4

2 回答 2

1

使用 GNU 实用程序:

grep -o ' [0-9][0-9]:[0-9][0-9]' file.log | sort | uniq -c | sort -nr | head -n 1

印刷

frequency  HH:MM

HH:MM是最高频率出现的小时和分钟,frequency是最高频率。如果您放弃,| head -n 1那么您将看到按频率排序的频率和分钟列表。

于 2020-07-30T21:48:15.730 回答
1

让我们考虑这个测试文件:

$ 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
于 2020-07-30T21:29:51.490 回答