在Bash 4.1中用关联数组实现按主机类型统计软件版本次数
解决Bash 4.1下按主机类型统计软件版本次数的问题
我会帮你写出list_versions.sh脚本,同时拆解每一步的逻辑,确保在Bash 4.1环境下能稳定运行。
脚本实现
#!/bin/bash # 先检查Bash版本,确保支持关联数组(Bash 4.0+特性) if [[ ${BASH_VERSINFO[0]} -lt 4 ]]; then echo "错误:需要Bash 4.0或更高版本才能运行此脚本" >&2 exit 1 fi # 定义关联数组存储统计结果,键格式为「主机类型:软件名:版本号」,值为使用次数 declare -A version_stats # 遍历所有匹配hostname_*.txt的文件 for file in hostname_*.txt; do # 跳过不存在的文件(避免没有匹配文件时触发错误) [[ -f "$file" ]] || continue # 用awk解析文件内容,提取关键信息并输出标准化格式 awk '{ host_type = $2 softA_ver = $4 softB_ver = $6 print host_type ":SoftA:" softA_ver print host_type ":SoftB:" softB_ver }' "$file" | while read -r stat_key; do # 对每个统计项计数自增 ((version_stats["$stat_key"]++)) done done # 整理并格式化输出统计结果 # 第一步:收集所有唯一的主机类型 declare -A unique_types for key in "${!version_stats[@]}"; do current_type=${key%%:*} # 拆分键,取第一个部分(主机类型) unique_types["$current_type"]=1 done # 按主机类型排序后逐个输出 for type in $(printf "%s\n" "${!unique_types[@]}" | sort); do echo "=== 主机类型: $type ===" echo "SoftA 版本统计:" # 筛选当前类型下的SoftA条目,排序后输出 for key in $(printf "%s\n" "${!version_stats[@]}" | grep "^$type:SoftA:" | sort); do ver=${key##*:} # 拆分键,取最后一个部分(版本号) count=${version_stats["$key"]} echo " $ver: $count 次" done echo "SoftB 版本统计:" # 筛选当前类型下的SoftB条目,排序后输出 for key in $(printf "%s\n" "${!version_stats[@]}" | grep "^$type:SoftB:" | sort); do ver=${key##*:} count=${version_stats["$key"]} echo " $ver: $count 次" done echo # 空行分隔不同主机类型的统计结果 done
脚本关键逻辑说明
- 版本兼容性检查:先验证Bash版本,避免低版本环境因不支持关联数组而报错。
- 关联数组设计:用
主机类型:软件名:版本号作为唯一键,确保每个统计项不会冲突。 - 文件解析:借助
awk快速提取固定位置的字段,避免手动拆分字符串的繁琐。 - 结果整理:先收集所有主机类型,排序后逐个输出对应软件的版本统计,保证输出结构清晰。
示例使用效果
假设你有以下几个测试文件:
hostname_web01.txt内容:host_type type_web SoftA version123 SoftB version456hostname_app01.txt内容:host_type type_app SoftA version123 SoftB version789hostname_web02.txt内容:host_type type_web SoftA version456 SoftB version456
运行./list_versions.sh后,输出会是:
=== 主机类型: type_app === SoftA 版本统计: version123: 1 次 SoftB 版本统计: version789: 1 次 === 主机类型: type_web === SoftA 版本统计: version123: 1 次 version456: 1 次 SoftB 版本统计: version456: 2 次
注意事项
- 确保目标文件的内容格式严格匹配示例:每行只有一条记录,字段顺序固定。
- 如果文件包含多行记录,脚本也能自动遍历处理。
- 脚本会自动对主机类型和版本号排序,输出结果更规整。
内容的提问来源于stack exchange,提问作者F4240
相关产品推荐
相关产品推荐

