Saída do comando 'watch' como uma lista

23

Eu quero fazer um cálculo simples do número de linhas por minuto adicionado a um arquivo de log.

Também quero armazenar a contagem para cada segundo.

O que eu preciso é a saída do seguinte comando como uma lista que será atualizada a cada segundo:

watch -n1 'wc -l my.log'

Como gerar a 'atualização' do comando 'watch' como uma lista?

    
por JohnJohnGa 19.11.2012 / 11:48

6 respostas

18

Você pode usar a opção -t para watch , o que faz com que ele não imprima o cabeçalho. No entanto, isso ainda limpará a tela para que você fique melhor com um simples loop de shell:

while sleep 1; do
    wc -l my.log
done

Uma das vantagens é que você pode adicionar facilmente outros comandos (por exemplo, date ) e / ou canalizar a saída por meio de sed para reformatá-lo. A propósito, se você trocar sleep 1 por wc no loop, ele terminará automaticamente em erros.

    
por 19.11.2012 / 12:20
4

Uma pergunta antiga, mas acabei de encontrar uma resposta muito fácil:

watch -n1 'wc -l my.log | tee -a statistics.log'

Isso executará seu wc a cada segundo, adicionará sua saída ao arquivo statistics.log e também mostrará na tela.
Então, você vai acabar com um arquivo cheio de números, representando o número sucessivo de linhas de my.log .

    
por 16.05.2013 / 16:31
3

Que tal

tail -f file.log | pv -rl > /dev/null
    
por 19.11.2012 / 12:31
1

Tente o seguinte:

watch -n1 'wc -l my.log >> statistics.log'
    
por 19.06.2014 / 19:19
0

Você pode criar um script que faça isso para você. Eu chamei o meu keep (como, continue fazendo) e coloque-o no caminho bin .

Este é o meu script:

#!/bin/bash
echo "Repeating command $* every second"
while sleep 1; do
    "$@"
done
    
por 03.03.2016 / 23:23
0

Me deparei com essa pergunta quando estava tentando obter uma saída melhor / registrada de du -sh $data_path . Eu usei o padrão "while command, do sleep" encontrado aqui, mas usei alguns AWK complexos para dar a saída que eu queria.

while du -sh $data_path; do sleep 1; done | awk '
$1 != size {
    size=$1;
    path=$2;
    time=systime();
    seconds=time-prevtime;
    if(seconds < 1000000000){
        seconds=seconds" seconds"
    }else{
        seconds=""
    }
    print size, path, strftime("%m/%d/%Y@%H:%M:%S", time), seconds; 
    prevtime=time
}'

Eu realmente fiz isso como um oneliner, e é por isso que existem ponto e vírgula. Mas para torná-lo legível, eu terminei. A saída se parece com:

502G /var/lib/cassandra/dump/ 05/22/2018@04:46:17
503G /var/lib/cassandra/dump/ 05/22/2018@04:46:59 42 seconds
504G /var/lib/cassandra/dump/ 05/22/2018@04:47:57 58 seconds
505G /var/lib/cassandra/dump/ 05/22/2018@04:48:55 58 seconds
506G /var/lib/cassandra/dump/ 05/22/2018@04:49:53 58 seconds
507G /var/lib/cassandra/dump/ 05/22/2018@04:50:50 57 seconds
508G /var/lib/cassandra/dump/ 05/22/2018@04:51:46 56 seconds
509G /var/lib/cassandra/dump/ 05/22/2018@04:52:44 58 seconds
510G /var/lib/cassandra/dump/ 05/22/2018@04:53:41 57 seconds
    
por 22.05.2018 / 06:54

Tags