Existe uma ferramenta que pode topar um fluxo de entrada?

7

Me deparo com alguns casos de uso em que seria muito útil receber uma entrada de um fluxo (normalmente delimitado por nova linha) e resumi-lo de uma forma semelhante à de um topo (veja acima, iotop, etc). Uma espécie de tabela dinâmica on-the-fly.

por exemplo. Pegue a entrada log-esque:

I heard A from unit 1 and it said "Great!" 56
I heard A from unit 2 and it said "Oh no!" 42
I heard C from unit 1 and it said "Waiting for input." 33
I heard B from unit 3 and it said "Stopped." -1
...

A partir disso, podemos executar uma ferramenta com indicadores de regex e de grupo:

topify [lineout] [regex] [name #1] [group #1] [name #2] [group #2] [All other columns name position]
     where:
         lineout is the number of lines before removing it from the display
         regex is a regex of the lines to match, complete with group indicators
         name #n is a string for the title of column n
         group #n is the number of the group in the regex

por exemplo,

topify '/^I heard ([A-Z]) from unit ([1-9]) and it said "(.*)" ([-0-9]*)$/' Unit 2 Status 1 Message 3 RetVal 4

Isso seria exibido de forma interativa, de modo que as colunas pudessem ser selecionadas / reordenadas, etc.:

Unit Status Message            Retval
1    C      Waiting for input. 33
2    A      Oh no!             42
3    B      Stopped.           -1

Eu entendo a fragilidade disso, mas eu ficaria realmente surpreso se não tivesse sido construído antes e quisesse verificar antes de começar a construí-lo. Eu também aprecio que não seja particularmente complicado escrever, então talvez todos tenham implementado sua própria solução ...

Alguém viu uma ferramenta como essa?

(Por favor, desculpe as tags que eu usei aqui. Eu sei que posso estar empurrando / quebrando as regras de algumas tags, mas isso é muito generalizado. Sugestões bem-vindas.)

    
por tudor 20.08.2013 / 02:59

1 resposta

1

Você não precisa escrever uma ferramenta, o conjunto de ferramentas unix padrão pode acomodá-lo muito bem.

#!/bin/bash
echo -e 'Unit\tStatus\tMessage\t\t\tRetval'
cat /var/log/filename | awk '{match($0,"\".*\"",a)}{print $6 "\t" $3 "\t" a[0] "\t\t" $NF}' |sort -k<fieldnum>

Coloque isso em um arquivo .sh e corra nele.

    
por 11.09.2013 / 03:57