如何在Bash关联数组中查找并替换指定键名?
解决Bash关联数组键名替换问题
你的思路完全没问题!Bash里确实可以通过遍历关联数组的键来实现这个替换,不过要注意关联数组的键不能直接修改,得通过「保存旧值→删除旧键→赋值新键」的方式来完成。
具体实现代码
按照你的遍历思路,完整的替换逻辑如下:
# 遍历关联数组的所有键名 for key in "${!hash[@]}"; do # 判断当前键是否为目标字符串"invalid" if [[ "$key" == "invalid" ]]; then # 先把旧键对应的失败次数存到临时变量 local fail_count="${hash[$key]}" # 删除原来的"invalid"键 unset hash["$key"] # 将次数赋值给新键"UNKNOWN" hash["UNKNOWN"]="$fail_count" # 由于你的场景里"invalid"键只会出现一次,找到后直接退出循环优化效率 break fi done
补充优化思路
其实你还可以在最初统计日志的时候就直接处理键名,这样就不用事后遍历数组做替换了,代码更简洁:
declare -Ai hash while read -r -a array; do if [[ "${array[5]} ${array[6]}" == "Failed password" ]]; then # 提前处理用户名称:如果是"invalid"就替换为"UNKNOWN" local user="${array[8]}" [[ "$user" == "invalid" ]] && user="UNKNOWN" # 累加计数 hash["$user"]+=1 fi done < "$FILEPATH"
关键说明
- Bash关联数组的键是不可变的,没有直接修改键名的语法,必须通过「删旧加新」的方式实现替换;
- 第一个方案里的
break可以保留,因为你的日志统计逻辑中同一个键只会累加计数,不会重复生成多个invalid键,提前退出能减少不必要的循环。
内容的提问来源于stack exchange,提问作者user3066571
相关产品推荐
相关产品推荐

