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

统计output.log第3列目标端口重复次数及关联规则需求

解决目标端口重复次数统计并关联规则编号的问题

你的需求是统计日志中目标端口的重复次数,并关联对应的规则编号,原脚本的逻辑过于繁琐且计数逻辑出错,我们可以用awk一步完成这个任务,高效又简洁。

正确的Shell脚本实现

awk -F'[ ;:]' '{
    port = $3
    rule = $NF  # 提取最后一个字段的规则编号
    count[port]++
    # 用二维数组存储每个端口对应的规则,自动去重
    if (!(rule in rules[port])) {
        rules[port][rule] = 1
    }
}
END {
    for (port in count) {
        # 拼接规则编号列表
        rule_list = ""
        for (r in rules[port]) {
            if (rule_list != "") rule_list = rule_list ", "
            rule_list = rule_list r
        }
        printf "The Port %s repeat %d Time in the Rule %s.\n", port, count[port], rule_list
    }
}' output.log

脚本逻辑解释

  1. 字段分隔符设置:-F'[ ;:]' 指定用空格、分号、冒号作为多字段分隔符,这样能轻松拆分出我们需要的端口和规则信息。
  2. 提取核心数据:
    • port = $3:每行的第3个字段就是目标端口
    • rule = $NF:$NF代表行的最后一个字段,这里直接拿到规则的编号数字
  3. 统计与去重存储:
    • count[port]++:用数组count记录每个端口的出现次数
    • rules[port][rule] = 1:借助二维数组的键唯一性,自动为每个端口去重存储对应的规则
  4. 格式化输出:在END块中遍历所有统计过的端口,拼接好规则列表后,按照你期望的格式输出结果。

运行结果

针对你提供的output.log内容,运行脚本后会输出:

The Port 443 repeat 2 Time in the Rule 45, 10.
The Port 80 repeat 2 Time in the Rule 25.
The Port 535 repeat 1 Time in the Rule 5.

原脚本的问题分析

  • 原脚本每次循环都重复读取整个文件获取唯一端口,效率极低;而且计数变量n没有在处理新行时重置,导致计数持续累加,结果完全错误。
  • 没有设计对应的存储结构来关联端口与规则,无法实现规则编号的收集和展示需求。

内容的提问来源于stack exchange,提问作者Lesther Martin Reyes Espinoza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:42:31