O método mais simples para contar linhas que correspondem a padrões específicos, incluindo '0' se a linha não for encontrada?

4

Eu tenho logs muito grandes (vários gigabytes por dia), que podem (mas não precisam) conter linhas específicas. Preciso contar o número de ocorrências de cada uma dessas linhas diariamente.

Eu tenho um arquivo patterns.in , que contém as linhas desejadas. Por exemplo:

aaaa
bbbb
cccc
dddd
eeee
ffff

Os arquivos de log podem ter esta aparência:

asd
dfg
aaaa
aaaa
sa
sdf
dddd
dddd
dddd
dddd
ghj
bbbb
cccc
cccc
cccc
fgg
fgh
hjk

A primeira (e talvez a abordagem mais óbvia) é usar grep , sort e uniq da seguinte maneira:

grep -f patterns.in logfile.txt | sort | uniq -c

que fornece o seguinte resultado:

   2 aaaa
   1 bbbb
   3 cccc
   4 dddd

Está perto do que eu quero alcançar, mas meu resultado desejado é:

   2 aaaa
   1 bbbb
   3 cccc
   4 dddd
   0 eeee
   0 ffff

Portanto, o problema é: como imprimir '0' se uma linha do arquivo pattern.in não for correspondida? Ele precisa ser feito da maneira mais simples possível, pois tudo que tenho disponível é o ambiente cygwin .

    
por Paweł Rumian 10.10.2012 / 18:45

1 resposta

7

que tal alimentar o arquivo de padrão de volta como um arquivo de dados para que cada padrão encontre pelo menos uma correspondência e, em seguida, subtraia uma da contagem reportada final para cada correspondência

grep -f patterns.in logfile.txt patterns.in | cut -f2 -d':' | sort | uniq -c | awk '{print($1 - 1" "$2)}'
    
por 10.10.2012 / 18:58

Tags