如何通过bash统计日志字符串出现次数,匹配IP后执行telnet命令
可行实现方案
你原有脚本的核心问题是IP匹配规则与实际日志格式不符,你写的/ IPaddr_/匹配规则在提供的样例日志中不存在对应内容,所以无法提取到带点的标准IP。以下是适配你给出的日志格式的完整可运行脚本:
#!/bin/bash log_file="world.log" search_string='is already connected on srv' threshold=5 # 统计ID连接次数、提取ID与IP的对应关系 result=$(awk -v ss="${search_string}" -v threshold="${threshold}" ' # 匹配连接日志,按ID统计次数 $0 ~ ss { id = $NF counter[id]++ } # 匹配kick日志,提取IP和ID的映射 /world_log_event: kick/ { split($NF, arr, "[()]") ip_addr = arr[1] id = arr[2] ip_map[id] = ip_addr } END { # 输出符合阈值要求的IP for (id in counter) { if (counter[id] >= threshold && ip_map[id] != "") { print ip_map[id] } } } ' "${log_file}") # 遍历符合条件的IP执行telnet命令 for ip in ${result}; do echo "检测到IP ${ip} 对应连接重试次数超过阈值,执行telnet命令" # 可根据需求修改telnet的参数 telnet ${ip} done
逻辑说明
- 统计逻辑与你的原有思路一致,匹配
is already connected on srv的行,按行末的ID统计出现次数 - 专门匹配kick事件的日志行,对行末
IP(ID)格式的内容用括号分割,分别提取IP和ID存入映射表 - 若同一个ID对应多条kick记录,脚本会自动取最新一条记录的IP,符合进程重启后ID对应IP可能变更的场景
- 外层循环逐行读取符合阈值要求的IP,执行对应的telnet命令即可
用你提供的样例日志测试该脚本,只会输出192.168.1.6并执行对应的telnet命令,完全符合你的预期逻辑。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

