印刷されたメモリ使用量をドットからコンマに変更し、メモリ使用量を%として計算します。

印刷されたメモリ使用量をドットからコンマに変更し、メモリ使用量を%として計算します。

これまでに以前に受けた質問のうち:物理メモリ使用量を計算するには、/proc/meminfo 1行を使用します(memtotal - memfree - キャッシュ済み - バッファリング済み)。

@Philippos ありがとうございます。このコマンドは正しいメモリ使用量を印刷します。

echo $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s__/1024-_g;s_$_/1024_' /proc/meminfo))) > test && awk -v CONVFMT='%.2f' '{print $1/1024""}' test && rm test

これは以下を印刷します:

1.32

これはbashの1行で計算された最終値に非常に近いです。ただし、より多くの手順を追加し(たとえば、恥ずかしいファイル生成と複数の同じコマンド)、すべての点をコンマに変換してみてください。値は次のように印刷できません。

1,32

このコマンド/ソリューションは、PythonのOLED画面に表示できるように友達に何かを渡すのに効果的です。

ただし、次の最後のステップは、システムメモリ全体と比較して使用量(%)を計算することです。だからこんな感じ:

43%

それから与えられた文章から出なければなりません。

時間をかけて読んで助けてくれた皆さんに感謝します。本当にありがとうございました!

ベストアンサー1

出力にはprintf(1)ユーティリティを使用できます。man 3 printf参考資料の書式指定子の説明を参照してください。特に、

一部の数値変換では、基数文字(「小数点」)または千単位のグループ化文字が使用されます。使用される実際の文字は、ロケールの LC_NUMERIC 部分によって異なります。 (setlocale(3)を参照してください。)POSIXロケールは基数文字として「.」を使用し、グループ化文字はありません。したがって、 printf("%'.2f", 1234567.89); 結果はPOSIXロケールでは「1234567.89」、nl_NLロケールでは「1234567,89」、da_DKロケールでは「1.234.567,89」です。

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

パーセンテージ出力の場合、1024で割ると精度が失われるため、望ましくない可能性があります。したがって:

printf "%d%%\n" $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/'\
'{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s_([^\n]+)\n_@\1@100*(\1-(_;s_\n_+_g;'\
's_@([^@]+)@(.*)$_\2))/\1_' /proc/meminfo) ))

上記のコマンドの正規表現は、おそらくよりエレガントでコンパクトにすることができます。

2つのコマンドを1つにまとめます。

printf "%0.2f MB %d%%\n" $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/'\
'{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s__/1024-_g;s_$_/1024_' /proc/meminfo) )) \
$(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/'\
'{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s_([^\n]+)\n_@\1@100*(\1-(_;s_\n_+_g;'\
's_@([^@]+)@(.*)$_\2))/\1_' /proc/meminfo) ))

修正する:使用されたメモリの割合をMB単位で計算するには精度が落ちたにもかかわらず、代わりに、以下を実行できます。

printf "%d%%\n" $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/'\
'{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s_([^\n]+)\n_@\1@100*(\1/1024-(_;s_\n_/1024+_g;'\
's_@([^@]+)@(.*)$_\2/1024))/(\1/1024)_' /proc/meminfo) ))

必要に応じて追加してください/1024。この場合、両方の計算を含む単一のコマンドは次のようになります。

printf "%0.2f MB %d%%\n" $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/'\
'{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s__/1024-_g;s_$_/1024_' /proc/meminfo) )) \
$(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/'\
'{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s_([^\n]+)\n_@\1@100*(\1/1024-(_;s_\n_/1024+_g;'\
's_@([^@]+)@(.*)$_\2/1024))/(\1/1024)_' /proc/meminfo) ))

アップデート2:Bashで上記のコマンドをインタラクティブに入力すると、インタラクティブモードとスクリプトの処理中(\<newline>内部の組み合わせに関して)Bashの動作が異なるため、機能し$()ないことがあります$(())。 mksh(私が使用している)などの他のシェルは、これに関して対話的に入力されたコマンドを別の方法で処理しません。

非常に長い行のように読みにくいコマンドは次のとおりです。

パーセント:

printf "%d%%\n" $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s_([^\n]+)\n_@\1@100*(\1/1024-(_;s_\n_/1024+_g;s_@([^@]+)@(.*)$_\2/1024))/(\1/1024)_' /proc/meminfo) ))

どちらの出力も1つのコマンドにあります。

printf "%0.2f MB %d%%\n" $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s__/1024-_g;s_$_/1024_' /proc/meminfo) )) $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s_([^\n]+)\n_@\1@100*(\1/1024-(_;s_\n_/1024+_g;s_@([^@]+)@(.*)$_\2/1024))/(\1/1024)_' /proc/meminfo) ))

おすすめ記事