Shell脚本实现按用户汇总unreserved与reserved数值及总和
需求说明
我有如下日志数据:
KEY v2025.10: user1 0/2 at 03/06 14:00 (handle: e01) KEY v2025.10: user1 1/2 at 03/06 14:01 (handle: f01) KEY v2025.10: user2 0/1 at 03/06 14:01 (handle: 1001) KEY v2025.10: user3 1/0 at 03/06 14:01 (handle: 1081) KEY v2025.10: user4 1/100 at 03/06 14:02 (handle: 11c1) KEY v2025.10: user5 1/1 at 03/06 14:02 (handle: 1201)
数据字段格式为:KEY v2025.10 $user $unreserved/$reserved at...,其中:
$user:用户名$unreserved:未预留数值$reserved:已预留数值
需要完成两个目标:
- 按
$user分别汇总$unreserved和$reserved的总和,示例输出如下:
user1 unreserved =1 user1 reserved =4 user2 unreserved =0 user2 reserved =1 user3 unreserved =1 user3 reserved =0 user4 unreserved =1 user4 reserved =100 user5 unreserved =1 user5 reserved =1
- 计算所有
$unreserved和$reserved的总和(本例总和为110)
我尝试了如下脚本,但无法得到预期结果:
grep handle | awk -F' ' '$1!=p{ if (NR>1) print p, s; p=$1; s=0} {s+=$12} END{print p, s}' | sort | uniq -c | sort -n
解决方案
可以用单条awk命令完成所有需求,无需额外管道命令:
awk -F'[: /]' '{ user = $3 unr = $4 res = $5 # 按用户累加未预留和已预留值 unreserved_sum[user] += unr reserved_sum[user] += res # 累加全局总和 total += unr + res } END { # 输出每个用户的汇总结果 for (u in unreserved_sum) { printf "%s unreserved =%d\n", u, unreserved_sum[u] printf "%s reserved =%d\n", u, reserved_sum[u] } # 输出全局总和 printf "\nTotal sum of unreserved and reserved: %d\n", total }' your_log_file.txt
命令解释
-F'[: /]':设置分隔符为冒号、空格和斜杠,直接提取$user(第3字段)、$unreserved(第4字段)、$reserved(第5字段)- 用两个关联数组
unreserved_sum和reserved_sum分别存储每个用户的未预留、已预留累加值 - 用变量
total累加所有数值的总和 - 在
END块中遍历数组输出每个用户的结果,再输出全局总和
执行结果
运行上述命令后,会得到如下输出:
user1 unreserved =1 user1 reserved =4 user2 unreserved =0 user2 reserved =1 user3 unreserved =1 user3 reserved =0 user4 unreserved =1 user4 reserved =100 user5 unreserved =1 user5 reserved =1 Total sum of unreserved and reserved: 110
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

