Ferramenta para visualizar os principais N itens no fluxo

2

Estou procurando ferramentas de linha de comando do Linux que possam realizar o seguinte:

Considere que há um fluxo de entrada /dev/inputstream que gera um fluxo infinito de dados que se parece com isso:

A
A
B
A
C
Z
A
.
.
.

NOTA: (cada linha é um caractere do alfabeto).

A ferramenta é usada da seguinte maneira:

cat /dev/inputstream | tool

A saída da ferramenta deve ser como a do comando "top". Deve ser uma lista continuamente atualizada dos principais itens que ocorrem com frequência.

Por exemplo:

A -- 10 times
B -- 8 times
Z -- 7 times
C -- 2 times
D -- 1 time

Se o fluxo não fosse infinito, eu poderia ter feito isso usando sort e uniq .

    
por Prashanth Ellina 15.05.2014 / 20:18

2 respostas

6

Eu encontrei esta ferramenta que corresponde exatamente à minha necessidade, chamada logtop . Segundo a documentação:

logtop displays real-time count of strings received in standard input.

Exemplos

É útil em alguns casos, como fazer o IP inundar seu servidor:

$ tail -f /var/log/apache2/access.log | cut -d' ' -f1 | logtop

Ou o melhor artigo do seu blog:

$ tail -f /var/log/apache2/access.log | cut -d' ' -f7 | grep article | logtop

Fedora / CentOS / RHEL

Não há RPM que eu possa encontrar para este aplicativo, mas é bem trivial fazer o download, compilar e instalar manualmente. Ele requer que 2 dependências sejam instaladas para poder compilá-lo.

$ sudo yum install uthash ncurses-devel

Você pode baixar o software do Github:

$ git clone https://github.com/JulienPalard/logtop.git

Para construí-lo:

$ cd logtop
$ make

Você pode instalá-lo ou executá-lo neste diretório, ./logtop .

Exemplo

$ tr -dc 'A-Z' </dev/urandom | fold -w 1 | head -n 10MB | ./logtop
10000 lines, 10000.00 lines/s
RANK    CNT   LINE/S LINE                                                                                                                             
   1    428   428.00 T
   2    417   417.00 G
   3    416   416.00 S
   4    414   414.00 K
   5    413   413.00 Q
   6    412   412.00 E
   7    401   401.00 I
    
por 15.05.2014 / 23:15
1

Em Perl:

perl -nle '
          $N = 5;      # Change as needed
          $freq{$_}++;
          if ( keys %freq >= $N ){
              @sorted = sort { $freq{$b} <=> $freq{$a} } keys %freq;
              for ( 0..$N-1){
                  $key = $sorted[$_];
                  print "$key -- $freq{$key} times";
              }
          }
          sleep 5;
          system(clear)
          ' < /dev/inputstream
    
por 15.05.2014 / 20:31