Eu sei é claro que
cat logfile.txt | wc -l
120
vai me dizer o número de linhas em um arquivo.
Enquanto que
tail -f logfile.txt
irá me mostrar as novas linhas que outro programa escreve logfile.txt
.
É possível combinar os dois para que eu obtenha uma contagem de linhas de atualização contínua de logfile.txt com os utilitários de texto padrão?
Eu sei sobre
watch wc -l logfile.txt
mas não quero contar novamente o arquivo inteiro a cada vez, isso parece um desperdício. Seria necessário contar apenas uma contagem a cada segundo e, provavelmente, uma em \r
vez de uma \n
no final da linha.
cat
produção da tubulaçãowc
também é um grande desperdício !!Respostas:
Talvez:
Lembre-se de que ele produziria um número para cada linha de entrada (apesar de substituir o valor anterior se enviado para um terminal).
Ou você pode implementar o
tail -f
shell manualmente:(observe que ele roda até um
wc
e umsleep
comando por segundo, que nem todos os shells incorporaram. Comksh93
whilesleep
, o builtin é incorporadowc
(pelo menos no Debian), você precisa adicionar/opt/ast/bin
na frente$PATH
(independentemente de saber se esse diretório existe ou não) ou usecommand /opt/ast/bin/wc
(não pergunte ...)).Você pode usar
pv
, como em:Mas cuidado que ele acrescenta
k
,M
... sufixos quando o número é mais de 1000 (e não parece ser uma maneira de contornar isso ).fonte
tail | awk
solução. Conheça suas opções:-n +0
não teria me ocorrido nessa combinação.pv
- outra nova ferramenta útil. muito obrigado.tail -n +0 -f <my.log> | grep --line-buffered <mystring> | awk '{printf "\r%lu", NR}'
awk
é um superconjunto degrep
.tail -n +0 -f file | awk '/mystring/ {printf "\r%lu", ++n}'
END{print ""}
para fazerawk
uma nova linha de impressão no final.Tente contar com puro
bash
semwc
:ou mesmo assim para reescrever o valor anterior:
fonte
Não acredito que exista algo assim. Mas deve ser fácil criar algo como:
(Idéia geral extraída de
perlfunc(1)
)fonte
printf foo >> file
. Você precisaria contar os caracteres de nova linha (comowc -l
faz na solução do shell que eu sugeri), não os registros retornados por<$fh>
. Eu não acho que você precisa usartell
ouseek
em tudo.<$fh>
lê uma linha por padrão, não registros. A página de manual do Perl citada diz para fazê-lo dessa maneira, em prol de um ambiente possivelmente não cooperativo (pode depender do sistema de arquivos, acho que o NFS ou outros sistemas de arquivos montados em rede podem exigir um pouco de estímulo).<$fh>
retornará um registro mesmo que não tenha sido finalizado por um caractere de nova linha. Portanto, seperl
estiver no final do arquivo, e alguém mais tarde fizer umprintf foo >> file
,<$fh>
retornaráfoo
(não uma linha, pois não foi finalizado por um caractere de nova linha) e$count
será incrementado mesmo que nenhuma linha extra tenha sido adicionada ao arquivo.Continuando a solução baseada em awk: talvez você não precise ver o contador marcando cada linha em seu log; é esse o caso, você pode tê-lo assim (o número mudaria a cada 10 linhas):
fonte