Я создал скрипт, который просматривает лог-файл и greps в течение определенного количества миллисекунд / секунд. Я создал что-то, что просматривает минимальное и максимальное значение, однако мне нужно найти среднее значение в списке.

logdir_8080='/opt/product/apachetomcat/8.5.5_8080/logs'
cd "$logdir_8080"

get_file=`ls -rt localhost_access_log.*.txt|tail -1`

cat $get_file | tail -1000 | grep "objectId" | awk -F 'HTTP/1.1" 200' '{ 
print $2}'|awk -F' ' '{ print $2 }' | sort - n>/opt/product/apachetomcat/apm/epagent/epaplugins/centrica/correspondence_log_files/8080.txt

min_value:

cat /opt/product/apachetomcat/apm/epagent/epaplugins/centrica/correspondence_log_files/8080.txt|head -1

max_value:

cat /opt/product/apachetomcat/apm/epagent/epaplugins/centrica/correspondence_log_files/8080.txt|tail -1

Идея списка:

233
249
283
283
302
303
332
333
643
851
965
965
972
1022
1135
1182
1213
1232
1264
1273
1390
1403
1414
1429
1474
1537
1540
1543
1545
1556
1565
1566
1577
1589
1591
1599
1602
1621
1622
1647
1653
1705
1740
1772
1774
1933
1935
1983
1990

Как получить среднее?

2 ответа2

1

Если в вашем файле есть только цифры, вы можете использовать одну команду awk, чтобы получить все.

awk 'BEGIN {themin=10000000; themax=0; thecount=0; thesum=0}
    {for (i=1; i<=NF; i++) {
        thesum += $i;
        thecount++;
        if ($i < themin) {themin = $i}
        if ($i > themax) {themax = $i}
    }}
    END {
      printf("The min is %d\nThe max is %d\nThe sum is %d\nThe total number of items is %d\nThe average of those items is %d\n", themin, themax, thesum, thecount, int(thesum/thecount))
}' _file_

Я разбил его, чтобы вы могли видеть различные разделы.

BEGIN только инициализирует все переменные, которые будут использоваться. Переменная themin может быть установлена на любое большее значение, если оно больше, чем что-либо в вашем файле.

Средняя часть просто проходит по каждой строке и каждому полю в этой строке. Это суммирование чисел и подсчет всех чисел, так что в конце можно сделать простое деление. Два оператора if собирают ваши минимальные и максимальные значения.

END распечатывает всю необходимую информацию, включая ваши минимальные, максимальные и средние значения.

Надеюсь это поможет.

0

Не нужно писать свои собственные решения для проблем, которые уже имеют великолепные решения. В конце концов, вы спрашивали о SuperUser, а не о StackOverflow.

Например, используйте GNU datamash

$ datamash min 1 max 1 mean 1 < yourFile
233     1990    1272.0408163265

или используйте инструменты из пакета num-utils

$ numbound -l yourFile
233
$ numbound yourFile
1990
$ numaverage yourFile
1272.04081632653

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .