Unix grep, sed, awk команды для определения среднего времени ответа на запрос из файлов журнала - PullRequest
1 голос
/ 28 сентября 2019

Требуется найти среднее время ответа на вызов API из набора файлов журнала.Из файлов журнала я хотел бы отфильтровать журналы выбора шаблона:

Eligible programs received from program service for user '89e45876-6ae7-2d08-217c-7320aada1a3d' in 840 ms.

, а затем взять среднее время всех ответов.

Я придумал нижекод с использованием команд grep, sed и awk, который печатает среднее время ответа для каждого файла журнала.

for file in *; do 
    if [ -f "$file" ]; then 
        cat $file | grep ".*Eligible programs received from program service for user .*" | sed -E -n "s/.*Eligible programs received from program service for user .* in (.*) ms.*/\\1/p" | awk '{ SUM += $1; COUNT += 1;} END { print SUM/COUNT }'
    fi 
done

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

Ответы [ 2 ]

1 голос
/ 28 сентября 2019

Если вы хотите взять среднее значение за файлом, попробуйте выполнить следующее (с GNU awk), спасибо @Jotne за указание на count = "".

awk '
/Eligible programs received from program service for user/{
  sum+=$(NF-1)
  count++
}
ENDFILE{
  print "Avg=" sum/count
  count=sum=""
}
' /path/to/your/files/*


РЕДАКТИРОВАТЬ: Если вы хотите усреднить для всех файлов, попробуйте:

awk '
/Eligible programs received from program service for user/{
  sum+=$(NF-1)
  count++
}
END{
  print "Avg=" sum/count
}
' /path/to/your/files/*
0 голосов
/ 28 сентября 2019

Вот как можно выполнить обе задачи (для каждого файла и всего) за один раз, если у вас не слишком много файлов, чтобы поместиться в список аргументов awk:

#!/bin/env bash

IFS=$'\n' read -r -d '' -a files < <(find . -maxdepth 1 -type f && printf '\0')

awk '
/Eligible programs received from program service for user/ {
    sum[FILENAME] += $(NF-1)
    cnt[FILENAME]++
}
END {
    for (i=1; i<ARGC; i++) {
        file = ARGV[i]
        print file, (cnt[file] ? sum[file] / cnt[file] : 0)
        tot_sum += sum[file]
        tot_cnt += cnt[file]
    }
    print "TOTAL", (tot_cnt ? tot_sum / tot_cnt : 0)
}
' "${files[@]}"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...