почему мой вывод не корректен при делении на переменную в awk?

Я записал немного сценария часов для наблюдения среднего числа загрузки на сервере Linux (только для изучения целей и потому что время работы часов не дает вывод, который я хочу).

Это работает отлично, но иметь среднее число загрузки для каждого Core i делят значения среднего числа загрузки суммой ядер. Это теперь сделано жестким кодированием ядра, но это сосет, если я хочу использовать его на другом сервере.

Из-за этого я хочу сделать ядра переменной как nproc.

Все хорошие и все, но по некоторым причинам когда я использую nproc в качестве базового количества, мой вывод, полностью отличаются затем, когда я трудно кодирую ядра...

Это - мой сценарий теперь:

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

Я в замешательстве здесь... Каким-либо идеям о том, почему это просто разве работает, не нравится он, должен?

0
задан 25 February 2020 в 18:23

1 ответ

В awk, $(nproc) означает значение nprocполе th, где nproc awk переменная. Так как Ваш код awk не определяет такую переменную, он оценивает к $0

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

Если Вы хотите передать значение оболочки, управляют заменой $(nproc) в Ваш код awk можно сделать настолько использующий -v синтаксис командной строки

Напр.

$ echo '1 2 3' | awk -v nproc=$(nproc) '{print nproc}'
2
1
ответ дан 17 March 2020 в 00:14

Другие вопросы по тегам:

Похожие вопросы: