awk - valor máximo de uma média móvel

1

Eu tenho um comando bash que me dá o maior valor na 9ª coluna de um arquivo:

cat "log.txt" | grep 1923 | awk '{print $9}' | sort -n | tail -1

log.txt é um log de uso da CPU para o processo 1923 & é medido 10 vezes por segundo.

Eu preciso verificar se o processo 1923 nunca excede um certo limite por mais de um segundo.

Alguém poderia me ajudar a formular um comando awk que:

  1. Calcula uma média de 1 segundo de rolamento
  2. Diz-me o valor máximo que encontra

Muito obrigado, Fidel

    
por Fidel 21.03.2013 / 18:54

1 resposta

3
#!/usr/bin/awk -f
# NOTE: This example takes only CPU load as input. Use it like this:
#
#    cat log.txt | awk '$1 == "1923" {print $9}' | awk -f rolling-average.awk

BEGIN {
    freq = 10; sum = 0; max = 0
}

{
    i = NR % freq
    if (NR > freq)
        sum -= data[i]
    sum += (data[i] = $1)
}

NR >= freq {
    avg = sum/freq
    print "average for " NR-freq+1 ".." NR " = " avg
    if (avg > max) {
        max = avg
        pos = NR
    }
}

END {
    print "peak " max " at " pos-freq+1 ".." pos
}

Editar: Corrigido um possível erro e removido a filtragem de linha (o que tornava as coisas mais complexas do que o necessário) - agora ele precisa receber apenas números de carga da CPU. Mas pelo menos calcula a média corretamente agora.

    
por 21.03.2013 / 19:22

Tags