스크립트는 다음과 같습니다.
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
후행을 %
네 번째 형식 지정자의 시작으로 처리합니다. %%
예를 들어, 리터럴 % 기호를 인쇄하려면 필요한
$ 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
유효한 형식 변환이 수행되지 않으면 %
그대로 출력됩니다.