从字符串中提取不同数量的值,并使用bash将其分配给变量

时间:2017-11-23 11:41:35

标签: string bash variables extract

我有这个字符串

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 ..对我来说似乎很棘手..有没有办法做到这一点?

1 个答案:

答案 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

并且您不必事先了解实际的驱动器号。