bashで私のMOTDとフロントOLEDディスプレイの実際のメモリ使用量を計算しようとしています。
残念ながら、数値をkBからMBに正しく変換しませんでした。しかし、公式は次のとおりです/proc/meminfo
。
MemTotal - MemFree - キャッシュ - バッファ
を使用して抽出できますgrep -e
。しかし、私は次の点を主張します。
- どのように値だけをgrepできますか
/proc/meminfo
? - この数字をkBをMB(/ 1024)に変換するにはどうすればよいですか?
だから私の使命は、上記の値を減算してその値を単一の値として印刷することです(加算MB
はボーナスです)。
答え1
GNUを使用すると、sed
次のことができます。
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
表現から4つの値をすべて抽出し、そこからコマンドe
の危険フラグを使用してコマンドを実行する計算を構成しますs
。
フラグ付きまたはなしのPOSIXバージョンの場合は、sed
コマンド置換を使用して計算から抽出を埋めることができます(同じことは危険です)。-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
5330MBの代わりに5333MBを出力します(実際の値:5330.16MB)。