Выведите цикл for в массив - PullRequest
0 голосов
/ 01 ноября 2019

Мне нужно, чтобы следующие выходные данные 4-й строки были помещены в массив, а затем вывели среднее значение из того же значения. ниже вывод lparstat системы AIX.

$ lparstat 2 10

System configuration: type=Shared mode=Uncapped smt=4 lcpu=16 mem=8192MB psize=16 ent=0.20

%user  %sys  %wait  %idle physc %entc  lbusy   app  vcsw phint  %nsp  %utcyc
----- ----- ------ ------ ----- ----- ------   --- ----- ----- -----  ------
  2.6   1.8    0.0   95.5  0.02   9.5    0.0  5.05   270     0   101   1.42
  2.8   1.6    0.0   95.6  0.02   9.9    1.9  5.38   258     0   101   1.42
  0.5   1.4    0.0   98.1  0.01   5.5    2.9  5.17   265     0   101   1.40
  2.8   1.3    0.0   95.8  0.02   8.9    0.0  5.37   255     0   101   1.42
  2.8   2.0    0.0   95.2  0.02  10.8    1.9  4.49   264     0   101   1.42
  4.2   1.7    0.0   94.1  0.02  12.2    0.0  3.66   257     0   101   1.42
  0.5   1.5    0.0   98.0  0.01   6.3    1.9  3.35   267     0   101   1.38
  3.1   2.0    0.0   94.9  0.02  12.1    2.9  3.07   367     0   101   1.41
  2.3   2.2    0.0   95.5  0.02   9.8    0.0  3.40   259     0   101   1.42
 25.1  25.5    0.0   49.4  0.18  89.6    2.6  2.12   395     0   101   1.44

Я сделал такой скрипт, но мне нужно нажать Enter, чтобы получить вывод.

$ for i in ` lparstat 2 10 | tail -10 | awk '{print $4}'`
> do
> read arr[$i]
> echo arr[$i]
> done
arr[94.0]
arr[97.7]
arr[94.9]
arr[91.0]
arr[98.1]
arr[97.7]
arr[93.0]
arr[94.8]
arr[97.9]
arr[89.2]

1 Ответ

2 голосов
/ 01 ноября 2019

Ваш скрипт нуждается только в небольшом улучшении для вычисления среднего значения. Вы можете сделать это внутри awk сразу:

lparstat 2 10 | tail -n 10 | awk '{ sum += $4 } END { print sum / NR }'

tail -n 10 занимает 10 последних строк.

{ sum += $4 } рассчитывается для каждой строки - она ​​суммирует значения на 4-йcolumn.

Затем блок END выполняется после прочтения всего файла. { print sum / NR } печатает среднее. NR - это «Количество записей», где одна запись - это одна строка, поэтому это число строк.

Примечания:

  • backticks `не рекомендуется. Современный синтаксис $( ... ) очень предпочтителен.
  • "for i in` cmd` "или чаще for i in $(...) является распространенным антипаттерном в bash. Используйте while read -r line при чтении строк из команды, например cmd | while read -r line; do echo "$line"; done или в bash while read -r line; do echo "$line"; done < <(cmd)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...