Eu tenho um arquivo crescente. while irá escrever o log do meu processo de aplicação. Nesse arquivo, há um log para "velocidade" como abaixo
(some text)
speed= 1x
(some text)
speed= 1x
(some text)
speed= 1x
(some text)
speed= 0.9x
..
..
(some text)
speed= 0.8x
(some text)
Eu tentei o código abaixo para obter o valor médio da velocidade.
awk '/speed/ {gsub("x","");print $2}' $PROCESS_LOG_FILE | awk -F : '{sum+=$1} END {print sum/NR}'
é possível obter a média das últimas 120 entradas? Eu tentei com grep e tail, mas demorou muito tempo desde que é um arquivo crescente.
Um pouco exagerado, talvez, mas como
tac
olseek
arquivo momentâneo terminará, você definiria o ponto no tempo necessário e, a partir daí, retrocederia até 120 velocidades encontradas:Ou para lidar com entradas que podem ter menos de 120 ocorrências do padrão:
Eu usaria perl em vez de awk para isso: bastante simples de lembrar apenas as últimas 120 velocidades:
Isso funciona para você?
grep speed test | tail -n 120 | cut -d " " -f 2 | cut -d "x" -f 1 | awk -F : '{sum+=$1} END {print sum/NR}'
Acabei de colocar sua entrada em um arquivo chamado
test
e executei isso. Resultado:0.94
No entanto, não é possível dizer qual será o desempenho em um arquivo enorme.
Você terá que usar uma tabela circular, aqui está um código de exemplo com os últimos 5 valores
você pode testar em um arquivo de amostra (ou na linha de comando, valores a serem inseridos na linha de comando).
em seguida, substitua 5 por 120 e
printf
alinhe com o que mais lhe convier.note que
+=$2
irá ignorar o trailingx
.