You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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
}

怎么用?

  1. 把上面的代码保存成rwlock_stats.awk文件
  2. 执行命令: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:04:35