离线环境下自动化统计设备日志的连接时长与连接次数
实现方案
1. 保留原CSV生成流程
先把你原来的脚本保留不动,继续生成raw_events.csv用来手动核查,我们在这个文件基础上做自动化计算。
2. 用Awk实现自动化统计
写个Awk脚本读取raw_events.csv,跟踪每个设备的连接时间,自动计算每次连接的时长,最后累加总时长和连接次数。
完整脚本示例
#!/bin/bash # 第一步:原流程生成原始事件CSV grep -E "(CONNECT|DISCONNECT)" /path/to/daily.log > raw_events.csv # 第二步:用Awk计算统计结果 awk -F ',' ' # 先输出表头 BEGIN { print "设备ID,总连接时长(秒),连接次数" } # 处理每一行记录 { time_str = $1 " " $2 device = $3 event = $4 # 把时间字符串转成Unix时间戳(秒),方便计算时长 cmd = "date -d \"" time_str "\" +%s" cmd | getline timestamp close(cmd) # 遇到连接事件,记录该设备的连接时间戳 if (event == "CONNECT") { connect_time[device] = timestamp } # 遇到断开事件,计算本次连接时长并累加 else if (event == "DISCONNECT" && connect_time[device] != "") { duration = timestamp - connect_time[device] total_duration[device] += duration connect_count[device] += 1 # 清空连接时间,避免重复计算 delete connect_time[device] } } # 所有行处理完后,输出统计结果 END { for (device in total_duration) { printf "%s,%d,%d\n", device, total_duration[device], connect_count[device] } } ' raw_events.csv > device_stats.csv
重点细节说明
- 时间转换:用
date -d把日志里的时间字符串转成时间戳,直接相减就能得到秒级时长。如果是BSD系统(比如Mac),date不支持-d参数,安装coreutils后用gdate代替即可。 - 状态跟踪:用数组
connect_time存储每个设备的连接时间戳,断开时计算完时长就清空该设备的记录,避免异常日志(比如连续两条断开事件)导致错误计算。 - 结果格式:输出依然是CSV格式,和原文件风格一致,不管是直接查看还是导入表格工具都方便。
3. 处理异常场景
- 如果日志存在只记录断开、无对应连接的情况:脚本会自动忽略,因为没有匹配的连接时间戳,不会执行计算逻辑。
- 如果日志存在设备连接后未记录断开的情况:可以在
END块中添加提醒逻辑,把这类设备输出到错误流:
END { # 输出未断开的设备到错误输出 for (device in connect_time) { printf "警告:设备 %s 存在未断开的连接\n", device > "/dev/stderr" } # 输出正常统计结果 for (device in total_duration) { printf "%s,%d,%d\n", device, total_duration[device], connect_count[device] } }
4. 运行脚本
给脚本添加执行权限:
chmod +x device_stats.sh
每日运行该脚本,就能同时生成raw_events.csv(用于手动核查)和device_stats.csv(自动化统计结果)。
内容的提问来源于stack exchange,提问作者azama88
相关产品推荐
相关产品推荐

