Você pode fazer algo como:
memory=$(
LC_ALL=C free -h | awk '
/^Mem/ {
suffix = $2
sub(/[0-9.]*/, "", suffix)
printf "%.0f%sB\n", $2, suffix
}'
)
( LC_ALL=C
para garantir que os números sejam impressos usando a raiz decimal .
(3.7G seria exibido como 3,7 G nas localidades usando vírgula como a raiz decimal)).
Nos sistemas GNU / Linux, você também pode fazer:
memory=$(
awk '/^MemTotal/{print $2*1024}' < /proc/meminfo |
numfmt --to=iec --format=%0f --suffix=B
)
Ou:
memory=$(
free -h | awk '/^Mem/{print $2}' |
numfmt --from=iec --to=iec --format=%0f --suffix=B
)
(aquele que lida com locales onde a raiz decimal não é .
).
Observe que free
no Linux informa que MemTotal
field de / proc / meminfo. Como por proc (5), esse é o total de RAM utilizável (isto é, RAM física menos alguns bits reservados e o código binário do kernel) . Para a RAM física e para PCs, como apontado pelo @StephenKit, é melhor você usar dmidecode
para obter as informações do BIOS, embora você precise de privilégios de superusuário para isso:
physical_memory=$(
sudo dmidecode -t memory |
awk '$1 == "Size:" && $2 ~ /^[0-9]+$/ {print $2$3}' |
numfmt --from=iec --suffix=B |
awk '{total += $1}; END {print total}' |
numfmt --to=iec --suffix=B --format=%0f
)