繁体   English   中英

提取列Awk的一部分

[英]Extract part of Column 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的新功能。

使用冒号和点作为字段分隔符,我们在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]
}

参考 ),或简单地将输出通过管道传递给| sort | sort

您可以做的一件事是:

awk 'BEGIN{FIELDWIDTHS = "1 11 1 12"} {print $4}' datetimes

指定字段宽度,然后例如,这将为您提供时间。 如果您不关心毫秒,请选择"1 11 1 8 4"

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM