提取Column Awk的一部分

时间:2018-05-02 21:18:20

标签: linux awk

我正在尝试计算搜索词的日志文件中每秒发生的次数。我一直在使用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的新手。

3 个答案:

答案 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个字符,将其用作数组的索引