Batch e Count inifite stdin

0

Suponha que você tenha algum comando linux / shell (por exemplo, nc ) que gera no stdout algumas strings separadas por quebra de linha. Este comando nunca termina com a saída (ou saídas por um longo tempo).

Estou procurando um comando para o qual eu possa canalizar essa saída e que me dê a cada x segundos uma contagem com que frequência a linha ocorreu.

Assim, o comando que estou procurando toma o stdin, divide-se em quebras de linha e conta quantas vezes cada linha aparece. A cada x segundos, gera as estatísticas e redefine os contadores para zero.

Esse comando / bash construct existe?

    
por theomega 31.03.2016 / 13:46

1 resposta

1

Que tal algo como isto:

#!/bin/bash                                                                     

LAST_OUTPUT=$(date +%s)                                                         
TMPFILE=$(mktemp)                                                               
INTERVAL=30                                                                     
while read LINE; do                                                             
  echo $LINE >> $TMPFILE                                                        
  NOW=$(date +%s)                                                               
  if  [[ $(($NOW - $LAST_OUTPUT)) -gt $INTERVAL  ]]; then                       
   sort < $TMPFILE | uniq -c                                                           
   echo -ne > $TMPFILE                                                         
   LAST_OUTPUT=$NOW                                                            
  fi                                                                            
done                                                                            

rm $TMPFILE                                                                     
    
por 31.03.2016 / 15:04