如何修改awk脚本,正确统计读写锁日志中的当前读者与写者数量?
这问题用awk处理简直是量身定做!毕竟awk天生就擅长这种逐字段、实时计数的场景。我给你写个实用的脚本,既能处理每行单个操作的情况,也能兼容你例子里那种一行多个操作的格式,完全贴合你的统计规则:
完整Awk脚本
BEGIN { # 初始化计数器 readers = 0 writers = 0 # 打印表头让输出更规整 printf "%-8s %-12s %-12s\n", "操作", "当前读者数", "当前写者数" printf "%-8s %-12s %-12s\n", "----", "------------", "------------" } # 遍历每行的每个操作字段(支持一行多个操作) { for (i = 1; i <= NF; i++) { op = $i # 根据操作类型更新计数器 if (op == "sr") { readers++ } else if (op == "dr") { readers-- } else if (op == "sw") { writers++ } else if (op == "dw") { writers-- } else { # 处理无效操作,避免干扰统计 printf "%-8s %-12s %-12s\n", op, "无效操作", "无效操作" continue } # 输出当前操作对应的实时统计值 printf "%-8s %-12d %-12d\n", op, readers, writers } } END { # 输出最终统计结果 printf "\n最终统计:读者数=%d,写者数=%d\n", readers, writers }
怎么用?
- 把上面的代码保存成
rwlock_stats.awk文件 - 执行命令:
awk -f rwlock_stats.awk 你的文本文件名.txt
示例效果
比如你的输入文件内容是:
sr sw dw dr
运行后会输出:
操作 当前读者数 当前写者数 ---- ------------ ------------ sr 1 0 sw 1 1 dw 1 0 dr 0 0 最终统计:读者数=0,写者数=0
简化版(不需要表头和最终统计)
如果你只需要实时输出每个操作后的计数,不需要格式规整的表头,可以用这个极简版本:
BEGIN { readers=0; writers=0 } { for(i=1;i<=NF;i++){ op=$i # 三元表达式简化逻辑 op=="sr"?readers++:(op=="dr"?readers--:(op=="sw"?writers++:(op=="dw"?writers--:0))) print op, "当前读者:", readers, "当前写者:", writers } }
这个脚本完全遵循你给定的规则:遇到sr读者数+1,dr-1;sw写者数+1,dw-1,不管操作的实际互斥逻辑,只做纯计数统计。
内容的提问来源于stack exchange,提问作者Grey
相关产品推荐
相关产品推荐

