我正在尝试计算我的 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
版本,您可以通过命令替换来填充计算中的提取(同样危险):-z
e
sed
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)。