统计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
脚本逻辑解释
- 字段分隔符设置:
-F'[ ;:]'指定用空格、分号、冒号作为多字段分隔符,这样能轻松拆分出我们需要的端口和规则信息。 - 提取核心数据:
port = $3:每行的第3个字段就是目标端口rule = $NF:$NF代表行的最后一个字段,这里直接拿到规则的编号数字
- 统计与去重存储:
count[port]++:用数组count记录每个端口的出现次数rules[port][rule] = 1:借助二维数组的键唯一性,自动为每个端口去重存储对应的规则
- 格式化输出:在
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
相关产品推荐
相关产品推荐

