Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux下的时间跟踪数据分析_Linux_Bash_Shell_Awk - Fatal编程技术网

linux下的时间跟踪数据分析

linux下的时间跟踪数据分析,linux,bash,shell,awk,Linux,Bash,Shell,Awk,我有一个包含事件时间序列的日志文件。现在,我想分析数据,计算不同时间间隔的事件数。每个条目都显示在此时间戳中发生了事件。例如,这里是日志文件的一部分 09:00:00 09:00:35 09:01:20 09:02:51 09:03:04 09:05:12 09:06:08 09:06:46 09:07:42 09:08:55 我需要每隔5分钟数一次事件。结果应该是: 09:00 4 //which means 4 events from time 09:00:00 until

我有一个包含事件时间序列的日志文件。现在,我想分析数据,计算不同时间间隔的事件数。每个条目都显示在此时间戳中发生了事件。例如,这里是日志文件的一部分

09:00:00
09:00:35
09:01:20
09:02:51
09:03:04
09:05:12
09:06:08
09:06:46
09:07:42
09:08:55
我需要每隔5分钟数一次事件。结果应该是:

09:00  4       //which means 4 events from time 09:00:00 until 09:04:59<br>
09:05  5        //which means 4 events from time 09:00:05 until 09:09:59<br>
09:00 4//表示从09:00:00到09:04:59之间的4个事件
09:05 5//表示从09:00:05到09:09:59的4个事件
等等

你知道bash、shell、awk等游戏中有什么把戏吗?

非常感谢您的帮助。

awk
为您提供救援

awk -v FS="" '{min=$5<5?0:5; a[$1$2$4min]++} END{for (i in a) print i, a[i]}' file
使用另一个示例输入

$ cat a
09:00:00
09:00:35
09:01:20
09:02:51
09:03:04
09:05:12
09:06:08
09:06:46
09:07:42
09:08:55
09:18:55
09:19:55
10:09:55
10:19:55

$ awk -v FS="" '{min=$5<5?0:5; a[$1$2$4min]++} END{for (i in a) print i, a[i]}' a
0900 5
0905 5
0915 2
1005 1
1015 1
$cat a
09:00:00
09:00:35
09:01:20
09:02:51
09:03:04
09:05:12
09:06:08
09:06:46
09:07:42
09:08:55
09:18:55
09:19:55
10:09:55
10:19:55
$awk-vfs=“”{min=$5awk的另一种方式

awk -F : '{t=sprintf ("%02d",int($2/5)*5);a[$1 FS t]++}END{for (i in a) print i,a[i]}' file |sort -t: -k1n -k2n

09:00 5
09:05 5
说明:

use : as field seperator
int($2/5)*5 is used to group the minutes into every 5 minute (00,05,10,15...)
a[$1 FS t]++ count the numbers.
the last sort command will output the sorted time.

Perl,输出通过管道传输到uniq,只是为了好玩:

$ cat file
09:00:00
09:00:35
09:01:20
09:02:51
09:03:04
09:05:12
09:06:08
09:06:46
09:07:42
09:08:55
09:18:55
09:19:55
10:09:55
10:19:55
11:21:00
命令:

perl -F: -lane 'print $F[0].sprintf(":%02d",int($F[1]/5)*5);' file | uniq -c
输出:

   5 09:00
   5 09:05
   2 09:15
   1 10:05
   1 10:15
   1 11:20
   1 11:00
09:00 5
09:05 5
09:15 2
10:05 1
10:15 1
11:00 1
11:20 1
或者只是perl:

perl -F: -lane '$t=$F[0].sprintf(":%02d",int($F[1]/5)*5); $c{$t}++; END { print join(" ", $_, $c{$_}) for sort keys %c }' file
输出:

   5 09:00
   5 09:05
   2 09:15
   1 10:05
   1 10:15
   1 11:20
   1 11:00
09:00 5
09:05 5
09:15 2
10:05 1
10:15 1
11:00 1
11:20 1

我意识到这是一个老问题,但当我偶然发现它时,我忍不住从另一个方向戳了戳它

sed -e 's/:/ /' -e 's/[0-4]:.*$/0/' -e 's/[5-9]:.*$/5/' | uniq -c
在这种形式中,它假定数据来自标准输入,或者在管道之前添加文件名作为最终参数

它与Michal最初的方法没有什么不同,但如果您碰巧需要对一个巨大的日志进行快速而不准确的分析,sed是一个轻量级且功能强大的工具

我们的假设是,数据确实是一种常规格式——结果中会出现任何问题

作为细分-给定输入

09:00:35
09:01:20
09:02:51
09:03:04
09:05:12
09:06:08
并分别应用每个编辑子句,中间结果如下: 1) 去掉第一个冒号

-e 's/:/ /'
09 00:35
09 01:20
09 02:51
09 03:04
09 05:12
2) 将分钟从0到4转换为0

-e 's/[0-4]:.*$/0/'
09 00
09 00
09 00
09 00
09 05:12
09 06:08
3) 将第5-9分钟转换为第5分钟:

-e 's/[5-9]:.*$/5/'
09 00
09 00
09 00
09 00
09 05
09 05
2和3还删除了行中的所有尾随内容,这将使行不唯一(因此“uniq-c”将无法生成所需的结果)

使用sed作为前端的最大优势可能是,您可以在感兴趣的行上进行选择,例如,如果root用户远程登录:

sed -e '/sshd.*: Accepted .* for root from/!d' -e 's/:/ /' ... /var/log/secure

是否需要打印包含0个事件的间隔?是的,当然。例如:10:15 0 10:20 1Did you look to petit()?如果时间间隔为10分钟,这将是一个完美的解决方案。但是对于5分钟的间隔,似乎需要更复杂的awk命令。