como classificar o log de acesso de forma eficiente em blocos

4

Os registros de acesso são mais ou menos ordenados por hora, mas para agregar conexões pelo tempo ( uniq -c ), é necessário classificá-los um pouco mais. Para um log de acesso enorme, a classificação é muito ineficiente, pois armazena e classifica todo o arquivo antes de imprimir qualquer coisa.

Você conhece alguma opção para classificação ou versão de classificação, que pode classificar apenas uma quantidade de linhas de uma só vez, a impressão desse bloco?

Eu pesquisei as seguintes palavras-chave: "streaming sort", "block sort", "approxima sort". Eu li o manual inteiro, sem uso. Definir o tamanho do buffer (-S) não influenciou isso.

    
por user39646 22.05.2013 / 10:51

4 respostas

2

Experimente split --filter :

split --lines 1000 --filter 'sort ... | sed ... | uniq -c' access.log

Isso dividirá access.log em trechos de 1.000 linhas e canalizará cada trecho através do filtro especificado.

Se quiser salvar os resultados de cada parte separadamente, você pode usar $FILE no comando filter e possivelmente especificar um prefixo (o padrão é x ):

split --lines 1000 --filter '... | uniq -c >$FILE' access.log myanalysis-

Isso gerará um arquivo myanalysis-aa contendo o resultado do processamento do primeiro fragmento, myanalysis-ab para o segundo fragmento, etc.

A opção --filter para split foi introduzida no GNU Coreutils 8.13 (lançado em setembro de 2011).

    
por 22.05.2013 / 11:30
3
tail -f access_log | awk -v 'cmd=sort --OPTION-IN-QUESTION | uniq -c' '
    {print $4, $1 | cmd}
    NR % 1000 == 0 {close(cmd)}'
    
por 22.05.2013 / 13:58
1

sort não é uma panacéia funcional, você deve usar outra ferramenta apropriada para filtrar seus dados antes que eles atinjam sort . tail provavelmente deve fazer o trabalho. Por exemplo, para obter as últimas 100 linhas classificadas, você pode fazer isso:

tail -100 /var/log/foo.log | sort
    
por 22.05.2013 / 11:07
0

Se você quiser apenas classificar parte do arquivo, use, por exemplo, sed .

Classifique a linha 15000 a 25000:

sed -n '15000,25000p' | sort

Se você for manter os arquivos classificados, você também pode considerar split .

Veja man split .

    
por 22.05.2013 / 11:08