使用 /proc/meminfo 单行计算实际内存使用情况(memtotal - memfree - cached - bufferd)

使用 /proc/meminfo 单行计算实际内存使用情况(memtotal - memfree - cached - bufferd)

我正在尝试计算我的 MOTD 以及 bash 中前置 OLED 显示屏的实际内存使用情况。

令人遗憾的是,我没有将数字从 kB 正确转换为 MB。但要知道,公式/proc/meminfo是:

MemTotal - MemFree - 缓存 - 缓冲区

我能够使用提取它们grep -e。但我坚持以下几点:

  • 我怎样才能只 grep 中的值/proc/meminfo
  • 如何将这些数字从 kB 转换为 MB (/1024)?

所以我的任务是减去上面提到的值,并将该值打印为单个值(附加MB是一个奖励)。

答案1

使用 GNUsed你可以做类似的事情

sed -zE 's_.*MemTotal: *([0-9]*).*\nMemFree: *([0-9]*).*\nBuffers: *([0-9]*).*\nCached: *([0-9]*).*_echo $(((\1-\2-\3-\4)/1024)) MB_e' /proc/meminfo

-z选项读取单个缓冲区中的整个文件proc/meminfo,以提取单个正则表达式中的所有四个值,并从中形成计算,以使用命令e的危险标志s来执行命令。

对于不带标志和不带标志的 POSIXsed版本,您可以通过命令替换来填充计算中的提取(同样危险):-zesed

echo $(( ($(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s//-/g' /proc/meminfo)) / 1024)) MB

我知道队伍很长,但不知怎的,两者都是单行话。

更新:不同的舍入

评论中要求在减法之前先将每个值转换为 MB。这是修改后的脚本:

echo $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s__/1024-_g;s_$_/1024_' /proc/meminfo))) MB

请注意,这会导致额外的舍入误差。例如

MemTotal:       16359572 kB
MemFree:         6614000 kB
Buffers:          602108 kB
Cached:          3685372 kB

将输出 5333 MB 而不是 5330 MB(真实值:5330.16 MB)。

相关内容