为什么在 awk 中除以一个变量时我的输出不正确?

为什么在 awk 中除以一个变量时我的输出不正确?

我编写了一个小型监视脚本来监视 Linux 服务器上的平均负载(仅用于学习目的,但监视正常运行时间并没有提供我想要的输出)。

它运行良好,但为了获得每个核心的平均负载,我将平均负载值除以核心数。现在这是通过对核心进行硬编码来实现的,如果我选择在另一台服务器上使用它,这会很不方便。

因此,我希望通过类似的变量来完成核心nproc

一切都很好,但是由于某种原因,当我使用nproc核心数时的输出与我对核心进行硬编码时的输出完全不同。

这是我现在的脚本:

#! /bin/bash
PATH=/usr/gnu/bin:/usr/bin:/usr/sbin:/sbin:/opt/csw/bin:/usr/local/bin:/bin

while true
do
    uptime | awk '{ printf "%2.2f ",$(NF-2)/4 ; printf "%2.2f ",$(NF-1)/4  ; printf "%2.2f\n",$(NF)/4}'
        sleep 1
done

如你所见,我将平均负载除以 4(4 核服务器)。这给出了以下输出:

$ ./watch-load.sh 
1.05 0.96 1.09
1.05 0.96 1.09
0.96 0.94 1.08
0.96 0.94 1.08
0.96 0.94 1.08

但是当我编辑脚本来使用nproc它时它看起来像这样:

#! /bin/bash
PATH=/usr/gnu/bin:/usr/bin:/usr/sbin:/sbin:/opt/csw/bin:/usr/local/bin:/bin

while true
do
    uptime | awk '{ printf "%.2f ",$10/$(nproc) ; printf "%2.2f ",$11/$(nproc)  ; printf "%2.2f\n",$12/$(nproc)}'
        sleep 1
done

这将给我以下结果:

$ ./watch-load-test.sh 
0.22 0.23 0.27
0.22 0.23 0.27
0.22 0.23 0.27
0.28 0.24 0.27
0.28 0.24 0.27

这很奇怪,因为nproc显示了 4 个核心:

$ nproc
4

我在这里迷茫了。你有什么建议吗?为什么它似乎没有按应有的方式工作?

答案1

在 awk 中,$(nproc)表示第 字段的值nproc,其中nproc是 awk 变量。由于您的 awk 代码没有定义这样的变量,因此它的计算结果为$0

$ echo '1 2 3' | awk '{print $(nproc)}'
1 2 3

如果要将 shell 命令替换的值传递$(nproc)到 awk 代码中,可以使用-v命令行语法

前任。

$ echo '1 2 3' | awk -v nproc=$(nproc) '{print nproc}'
2

相关内容