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末尾を%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有効な形式変換が行われない場合は%そのまま出力されます。

関連情報