BASH - разделение строки и вывод ее в указанном формате c - PullRequest
1 голос
/ 06 апреля 2020

У меня есть строка, которую я получаю от системы, которая выглядит следующим образом:

               total        used        free      shared  buff/cache   available
Mem:           605M        147M        103M         82M        353M        353M
Swap:            0B          0B          0B

Мне нужно, чтобы вывод выглядел так:

total: 605M, used: 147M, free: 103M, shared: 82M, buff/cache: 353M, available: 353mb

Я попытался разделить строку, но он только возвращает заголовок:

getMemoryInfo() {
memoryinfo=$(free -h)
IFS=' ' read -a  arr <<< "${memoryinfo}"

echo "{$memoryinfo}"

for i in "${arr[@]}"
do
echo "$i"
done
}

Каков наилучший способ заставить это работать?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 06 апреля 2020

Не могли бы вы попробовать следующее. где var - ваша переменная bash / shell, которая имеет значение показанных образцов.

echo "$var" |
awk '
{
  count=""
  if(/^ /){
    start=1
  }
  else{
    start=2
  }
  for(i=start;i<=NF;i++){
    ++count
    array[count]=(array[count]?array[count]": ":"")$i
  }
}
FNR==2{
  for(i=1;i<=count;i++){
    printf("%s%s",array[i],i==count?ORS:", ")
  }
}'
1 голос
/ 06 апреля 2020

Bash вариант

arr=( $(free -h) )
keys=("${arr[@]::6}")
vals=("${arr[@]:7:6}")

for i in ${!keys[@]}; { printf "%s: %s, " "${keys[i]}" "${vals[i]}"; }

Или это для удаления последней запятой

for i in ${!keys[@]}; { printf -v data[i] "%s: %s, " "${keys[i]}" "${vals[i]}"; }
data="${data[@]}"
echo ${data%,*}
1 голос
/ 06 апреля 2020

Вы можете использовать

free -h | awk '
/total/{
for (i=1;i<=NF;i++){
    header[i]=$i
    }
}
/Mem:/{for (i=2;i<=NF;i++){
    mem[i-1]=$i
    }
    nf=NF-1
}
END{
    for (i=1;i<=nf;i++){
        printf "%s", sep header[i] ": " mem[i]; sep=", "
    }
}
...