我有这个字符串
OK - C: Total=39.90GB, Used=27.51GB (69.0%), Free=12.39GB (31.0%) OK - F: Total=230.00GB, Used=214.86GB (93.4%), Free=15.14GB (6.6%) OK - G: Total=10.00GB, Used=4.03GB (40.3%), Free=5.97GB (59.7%) OK - H: Total=510.00GB, Used=492.82GB (96.6%), Free=17.17GB (3.4%) |'C: Space'=27.51GB; 'C: Utilisation'=69.0%; 'F: Space'=214.86GB; 'F: Utilisation'=93.4%; 'G: Space'=4.03GB; 'G: Utilisation'=40.3%; 'H: Space'=492.82GB; 'H: Utilisation'=96.6%;
这些是使用nagios提取的Windows机器上的驱动器。所以数字和字母可能会从字符串更改为字符串..我想从这种类型的字符串中提取驱动器的编号(在这种情况下为4) ),字母(CFGH)和各种总和和自由值,并将所有这些分配给不同的变量与bash ..对我来说似乎很棘手..有没有办法做到这一点?
答案 0 :(得分:0)
使用这种数据可以更容易地管理关联数组,而不是一堆单独的变量名称
str="OK - C: Total=39.90GB, ..."
Count=0
declare -A Total Free
while read drive; read total; read free; do
((Count++))
Total[$drive]=$total
Free[$drive]=$free
done < <(
grep -oP '(?<=OK - )[A-Z]|(?<=Total=)\d+|(?<=Free=)\d+' <<<"$str"
)
declare -p Count Total Free
declare -- Count="4"
declare -A Total='([C]="39" [F]="230" [G]="10" [H]="510" )'
declare -A Free='([C]="12" [F]="15" [G]="5" [H]="17" )'
grep -o
是从字符串中提取驱动器号以及总值和空值的魔力。
我假设Total = x总是出现在Free = y
使用数组,您现在可以执行以下操作:
for drive in "${!Total[@]}"; do
printf "%s, total=%d, free=%d\n" "$drive" "${Total[$drive]}" "${Free[$drive]}"
done
并且您不必事先了解实际的驱动器号。