スクリプトは次のとおりです。
TYPE="${BLOCK_INSTANCE:-mem}"
awk -v type=$TYPE '
/^MemTotal:/ {
mem_total=$2
}
/^MemFree:/ {
mem_free=$2
}
/^Buffers:/ {
mem_free+=$2
}
/^Cached:/ {
mem_free+=$2
}
/^SwapTotal:/ {
swap_total=$2
}
/^SwapFree:/ {
swap_free=$2
}
END {
if (type == "swap") {
free=swap_free/1024/1024
used=(swap_total-swap_free)/1024/1024
total=swap_total/1024/1024
} else {
free=mem_free/1024/1024
used=(mem_total-mem_free)/1024/1024
total=mem_total/1024/1024
}
pct=used/total*100
# full text
printf("%.1fG/%.1fG (%.f%)\n", used, total, pct)
# short text
printf("%.f%\n", pct)
# color
if (pct > 90) {
print("#FF0000\n")
} else if (pct > 80) {
print("#FFAE00\n")
} else if (pct > 70) {
print("#FFF600\n")
}
}
' /proc/meminfo
実行しようとしたときに発生するエラーは次のとおりです。
$ ./memory
awk: run time error: not enough arguments passed to printf("%.1fG/%.1fG (%.f%)
")
FILENAME="/proc/meminfo" FNR=46 NR=46
1.1G/15.3G (7
私が望むもの(メモリ使用量)を印刷しますが、エラーもあります。
誰でも助けることができますか?
答え1
Awk は、printf
末尾を%
4 番目の書式指定子の先頭として扱います。%%
たとえば、リテラル%記号を印刷するために必要です
$ awk 'BEGIN{printf("%.1fG/%.1fG (%.f%%)\n", 1.2, 3.4, 5.6)}'
1.2G/3.4G (6%)
答え2
有効な形式でない場合は、mawk
リテラル印刷をサポートしていないを使用したようです。%
末尾の行を%
次に変更します。
# full text
printf("%.1fG/%.1fG (%.f%%)\n", used, total, pct)
# short text
printf("%.f%%\n", pct)
gawk
または に切り替え、nawk
有効な形式変換が行われない場合は%
そのまま出力されます。