Como dividir meu arquivo de log em vários arquivos de log de acordo com os valores das colunas?

0

O arquivo de registro de minhas conexões está estruturado da seguinte forma:

hostname direction timestamp bps

Aqui está um fragmento do meu arquivo de log:

www.youtube.com DOWNLOAD 1479897661131903 23508910
www.youtube.com UPLOAD 1479897661131922 735
fonts.gstatic.com DOWNLOAD 1479897660289990 527
ssl.gstatic.com UPLOAD 1479897660152435 2094
fonts.gstatic.com DOWNLOAD 1479897660290973 6662177

Eu quero classificá-lo de acordo com o timestamp e o hostname: Eu tentei

sort -k 3 -o sortedTimestamps.log connectionLog.txt

e o resultado é

ssl.gstatic.com UPLOAD     1479897660152435 2094
fonts.gstatic.com DOWNLOAD 1479897660289990 527
fonts.gstatic.com DOWNLOAD 1479897660290973 6662177
www.youtube.com DOWNLOAD   1479897661131903 23508910
www.youtube.com UPLOAD     1479897661131922 735

Agora, isso é apenas uma amostra: há mais e mais linhas e, por enquanto, com o sort acima, o arquivo de log é apenas classificado por timestamp. Como preciso plotar isso, gostaria de ter arquivos de log diferentes de acordo com hostname e direction , contendo timestamp e bps .

O resultado final seria ter um arquivo de log para cada hostname :

www.youtube.com_DOWNLOAD_log ,

www.youtube.com_UPLOAD_log ,

fonts.gstatic.com_DOWNLOAD_log ,

fonts.gstatic.com_UPLOAD_log

e assim por diante; cada arquivo de log deve conter apenas duas colunas, classificado timestamp e seu correspondente bps .

Por exemplo: www.youtube.com_DOWNLOAD_log contém:

timestamp1 bps1
timestamp2 bps2
timestamp3 bps3
...

Plotando isso em um gráfico, o eixo X seria timestamp e o eixo Y bps . Eu vou plotar todos juntos e ver como bps muda no tempo para várias conexões.

PS: esta é minha primeira tentativa de visualizar dados, então pode haver uma maneira mais inteligente de plotar um arquivo de log estruturado como o meu, mas como aqui as perguntas devem ser respondidas e não discutidas, me ajude a dividir meu arquivo de log em vários arquivos de log, um para cada direção de nome de host.

Edit (2) : graças a Kalavan, aqui está meu script:

Oh, o cachimbo! Oh, o poder do Bash! Eu amo isso! Aqui está meu script completo:

#!/bin/bash

echo -e "\nCleaning previous log files...\n"
rm *.log

# File name: HOSTNAME_DIRECTION.log

sort -k1 -k3n connectionLog.txt | awk '{print $3 " " $8 >> $1"_"$2".log"}'

to_plot_upload_files="plot "
to_plot_download_files=" plot "

for file in $(ls *UPLOAD.log); do
    to_plot_upload_files="$to_plot_upload_files \"$file\" using 1:2 with lines, "
done

for file in $(ls *DOWNLOAD.log); do
    to_plot_download_files="$to_plot_download_files \"$file\" using 1:2 with lines, "
done

echo $to_plot_upload_files | gnuplot -persist
echo $to_plot_download_files | gnuplot -persist
    
por elmazzun 23.11.2016 / 13:03

1 resposta

1

Para começar, tente algo assim. Você pode ajustá-lo ainda mais se for adequado para você:

sort -k1 -k3n connectionLog.txt | awk '{print $1 " " $3 " " $4 >> $1".log"}'

Editar:

Senti falta de você não querer nomes de host nos logs. Omitir impressão primeiro campo ($ 1).

    
por 23.11.2016 / 14:46