
Я создал скрипт, который просматривает файл журнала и выполняет 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
мин_значение:
cat /opt/product/apachetomcat/apm/epagent/epaplugins/centrica/correspondence_log_files/8080.txt|head -1
максимальное_значение:
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
Как получить среднее значение?
решение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 выводит всю необходимую информацию, включая минимальное, максимальное и среднее значение.
Надеюсь это поможет.
решение2
Не нужно писать собственные решения для проблем, которые уже имеют великолепные решения. В конце концов, вы спрашивали на SuperUser, а не на StackOverflow.
Например, используйте GNUdatamash
$ 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