Manter um registro de um arquivo de log

2

Eu tenho um arquivo chamado output.log que tem este conteúdo:

Thread started
Thread finished
Thread started
Thread finished
Thread started
Thread started

Eu monito sua saída usando:

tail -f output.log

Gostaria de escrever um comando para manter uma contagem de quantos segmentos estão sendo executados agora. Para o caso acima, a saída seria:

2 threads are running

Devo talvez usar grep e de alguma forma manter um registro das instâncias de string?

    
por Fidel 11.03.2015 / 13:24

3 respostas

3

Você pode usar awk para fazer a contagem. Embora, se nada mais complicado envolvido, você pode usar

tail -f output.log | awk '/Thread started/{n++}/Thread finished/{n--} END { printf ("%d Threads are running\n", n)}' output.log

Melhor ainda, use watch da seguinte forma:

watch -n.2 -x awk '/Thread started/{n++}/Thread finished/{n--} END { printf ("%d Threads are running\n", n)}' output.log

O -n.2 atualizará todos os 0.2s , conforme exibido na parte superior da tela.

    
por 11.03.2015 / 13:41
2

Você pode tentar o seguinte script bash :

#!/bin/bash
start_count=$(grep -c "started" /path/to/output.log)
finish_count=$(grep -c "finished" /path/to/output.log)
echo "$((start_count - finish_count)) threads are running"

Isso considera todos os encadeamentos em execução anteriormente que estão fora do escopo imprimível de tail -f . Aqui nós contamos as ocorrências de "iniciado" e "terminado" no arquivo e então simplesmente subtraímos os valores para obter o resultado. Se você quiser, escolha qualquer intervalo de linhas (por exemplo, tail -30 /path/to/output.log ) para ler em vez de todo o arquivo e, em seguida, localize o resultado considerando essas linhas.

    
por 11.03.2015 / 13:59
1

Tente executar este script,

a=$(grep started output.log | wc -l)

b=$(grep finished output.log | wc -l)

echo Total Running threads: "$[$a-$b]"

Crie um script bash e cole as linhas acima nele. Você receberá os tópicos em execução.

    
por 11.03.2015 / 14:11

Tags