Existe um comando Unix / Linux para contar linhas por segundo do stdin?

22

Estou tentando contar o número de consultas SQL por segundo de um arquivo de log e quero fazer isso em tempo real, canalizando stdout do grep para algum comando. (Estou fazendo alguns testes de desempenho)

Eu mesmo poderia escrever, mas pensei com certeza que isso existiria.

Eu olhei para o wc, mas não vi uma opção para permitir isso.

Eu também poderia usá-lo para contar solicitações por segundo canalizando uma cauda do log de acesso.

digidigo
fonte
Estou procurando por algo mais geralmente útil do que essa pergunta se refere.
digidigo 31/01

Respostas:

2
watch -n 3 "wc -l logfile"

página de manual

watch - executa um programa periodicamente, mostrando a saída em tela cheia Por padrão, o programa é executado a cada 2 segundos; use -n ou --interval para especificar um intervalo diferente.

Nim
fonte
45

pvé seu comando! P ipê V iewer imprime estatísticas sobre os dados que passa através dele, e pode ser executado em qualquer lugar no seu pipeline, uma vez que tubos stdin diretamente sobre a stdout. Por exemplo:

tail -f /var/log/nginx/access.log | pv --line-mode --rate > /dev/null

O pvcomando imprime para stderr o número atual de linhas por segundo (o padrão é bytes por segundo), que, para essa fonte de dados específica (arquivo de log padrão do Nginx), equivale a solicitações da Web recebidas por segundo. Eu só me preocupo com as contagens, então entro em pânico /dev/null. Existem também opções como:

  • -b (número total de linhas),
  • --average-rate (taxa média desde o início) e
  • --timer (rastreia quanto tempo o cano está funcionando).

Caso contrário --line-mode, ele contará bytes, o que provavelmente não é o que você deseja para os logs do servidor, mas pode ser útil em outros lugares.

Nota final: ... | pv -lb > file.txté muito parecida ... | tee file.txt | awk '{printf "\r%lu", NR}', o que também é útil para contar linhas, mas a pvchamada é muito mais curta, embora a saída não seja tão interessante - pvatualiza a cada segundo por padrão, enquanto esse awkcomando é atualizado continuamente.

chbrown
fonte
É possível obter apenas um valor de pv? Preciso de valor médio por período de tempo para fins de monitoramento. Então, eu preciso atribuir valor à variável.
Sonique
@Sonique é uma ilusão, já que não pvé para isso que eu construía (eu procuraria awkse fosse você), mas é claro que é possível. Suponha que twilight stream --timeout 5é um comando que vai provar do spritzer Twitter por 5 segundos e em seguida, saia: RATE="$(twilight stream --timeout 5 | pv --line-mode --rate --force 2>&1 1>/dev/null | tr -s '\r\n' '\n' | tail -1)", em seguida, echo $RATEproduz algo como "[40,8 / s]" (note o adicional de --forcebandeira, uma vez que pv's stderrnão é mais um TTY).
chbrown
Não parece funcionar de forma confiável para mim em todos os programas; removendo as > /dev/nullmostras de que a saída está agora "em bloco" e não transmite mais sem problemas. Talvez unbufferseja necessário em alguns programas de produção para que eles não mudem para bloquear o buffer de saída quando detectam que estão sendo canalizados?
NH2
13

Talvez você devesse tentar logtop?

tail -f foobar.log |logtop
Klocek
fonte
É a parte superior do log que você está se referindo? github.com/JulienPalard/logtop
digidigo
Sim, se você estiver usando o debian, há um pacote no repositório packages.debian.org/wheezy/logtop
klocek
Dang Eu acho que isso é o que eu preciso, mas eu não poderia obtê-lo para compilar no CentOS
digidigo
1
watch -n 5 "mysqladmin status | awk -F'  ' '{ print \$NF }'"
quanta
fonte
Não consegui fazer isso funcionar. Você tem certeza da sintaxe?
digidigo 31/01
Qual erro você recebe? Você configurou ~/.my.cnfpara executar mysqladminsem solicitar a senha?
Quanta