awk 런타임 오류: 전달된 인수가 부족합니다.

awk 런타임 오류: 전달된 인수가 부족합니다.

스크립트는 다음과 같습니다.

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유효한 형식 변환이 수행되지 않으면 %그대로 출력됩니다.

관련 정보