Bash脚本处理日志:去除ipHostNumber前缀提取IP存入数组并ping检测
可行实现方案
你原来的代码主要问题是没有做前缀摘除的逻辑,且循环内的数组赋值逻辑错误,以下是可直接运行的实现:
完整代码(优先推荐,用bash内置功能,无外部依赖)
#!/bin/bash # 替换为你的实际日志文件路径 destlog="/your/log/path.log" # 读取日志所有行到数组 readarray -t origin_lines < "$destlog" # 若你需要去掉日志第一行,取消注释下一行 # unset origin_lines[0] # 初始化纯IP数组 ip_list=() for line in "${origin_lines[@]}"; do # 摘除每行开头的ipHostNumber: 前缀 current_ip="${line#ipHostNumber: }" # 过滤空行避免无效ping [[ -n "$current_ip" ]] && ip_list+=("$current_ip") done # 遍历IP执行ping操作,-c 2表示只发2个包,可自行调整 for ip in "${ip_list[@]}"; do echo "Ping $ip 中:" ping -c 2 "$ip" if [ $? -ne 0 ]; then echo "*$ip ping失败*" fi echo "=====================" done
简洁版实现(调用sed预处理,代码更短)
#!/bin/bash destlog="/your/log/path.log" # 直接读取处理好的IP到数组,同时过滤空行 readarray -t ip_list < <(sed 's/^ipHostNumber: //' "$destlog" | grep -v '^$') # 后续ping逻辑和上面一致 for ip in "${ip_list[@]}"; do ping -c 2 "$ip" done
关键逻辑说明
${line#ipHostNumber: }是bash内置的前缀删除语法,不需要调用外部工具,执行效率更高- 增加了空行过滤逻辑,避免日志中的空行或者格式异常行导致ping报错
- ping命令增加了
-c参数指定发包数量,避免持续ping不停止
内容的提问来源于stack exchange,提问作者blazzeq
相关产品推荐
相关产品推荐

