我正在尝试计算搜索词的日志文件中每秒发生的次数。我一直在使用AWK,并且时间戳的问题位于包含附加信息的列中。是否可以通过仅查找00:00:00 - 24:00:00的时间模式来获取每秒的出现次数?
数据示例:
[01/May/2018:23:59:59.532
[01/May/2018:23:59:59.848
[01/May/2018:23:59:59.851
[01/May/2018:23:59:59.911
[01/May/2018:23:59:59.923
[01/May/2018:23:59:59.986
[01/May/2018:23:59:59.988
[01/May/2018:23:59:59.756
[01/May/2018:23:59:59.786
[01/May/2018:23:59:59.883
到目前为止,我可以使用以下方法轻松提取数据:
awk '/00:00:00/,/24:00:00/{if(/search_term/) a[$4]++} END{for(k in a) print k " - " a[k]}' file.log |sort
这将返回:
[02/May/2018:10:40:05.903 - 1
[02/May/2018:10:40:05.949 - 1
[02/May/2018:10:40:05.975 - 1
[02/May/2018:10:40:05.982 - 2
[02/May/2018:10:40:06.022 - 1
[02/May/2018:10:40:06.051 - 1
[02/May/2018:10:40:06.054 - 1
[02/May/2018:10:40:06.086 - 1
[02/May/2018:10:40:06.094 - 1
[02/May/2018:10:40:06.126 - 1
我的目标更多是:
10:40:05 - 5
10:40:06 - 6
不知道我是否正确地考虑过这个问题。一般来说是AWK的新手。
答案 0 :(得分:3)
使用冒号和点作为字段分隔符,我们在col2中有小时,在col3中有分钟,在col4中有几秒
awk -F'[:.]' '
{count[$2 ":" $3 ":" $4]++}
END {for (time in count) print time " - " count[time]}
' file
10:40:05 - 4
10:40:06 - 6
输出不一定要排序。如果您使用的是GNU awk,请使用
END {
PROCINFO["sorted_in"] = "@ind_str_asc"
for (time in count)
print time " - " count[time]
}
(reference),
或者只是将输出传递给| sort
答案 1 :(得分:-1)
你可以做的一件事是:
awk 'BEGIN{FIELDWIDTHS = "1 11 1 12"} {print $4}' datetimes
指定字段宽度,然后这将为您提供时间,例如。如果你不在乎毫秒,那么"1 11 1 8 4"
答案 2 :(得分:-1)
您可以将行的substr用作数组的索引。例如,你有这个文件
cat 1.txt
[01/May/2018:23:59:59.532
[01/May/2018:01:59:59.848
[01/May/2018:02:59:59.851
[01/May/2018:02:59:59.911
[01/May/2018:02:59:59.923
[01/May/2018:02:00:59.986
您可以使用像这样的awk命令
cat 1.txt | awk '{a[substr($0,index($0,":")+1,8)]++} END{for(i in a) print i" - "a[i]}'
其中substr($ 0,index($ 0,“:”)+ 1,8)从第一个“:”出现时减少8个字符,将其用作数组的索引