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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:21:00