Como converter arquivo de log para CSV usando o bash

0

É possível transformar essa entrada de log em um arquivo csv formatado corretamente usando sed / awk? Eu tentei várias maneiras de fazer isso usando sed / awk. Infelizmente eu não consegui. Antes que eu faça isso em perl. Isso é possível em AWK / sed ou talvez até mesmo bash

Jan 21 11:10:45 hostname.internal.nl THREAT 2015/01/21 11:10:44 critical 5 reset-both outside 10.10.10.10 inside 10.16.61.4 tcp 39898 80 web-browsing any Bash Remote Code Execution Vulnerability(36731)

Como isso

Date  | Hostname | Threat | DATE+time | Critical/High | Count | --- | External IP | Internal IP | TCP/UDP | Port | External Port| Category | Vulnerability 

Jan 21 11:10:45 | hostname.internal.nl | THREAT | 2015/01/21 11:10:44 | critical 5 reset-both | outside 10.10.10.10 | inside 10.16.61.4 | tcp  39898 | 80 | web-browsing | 4any Bash Remote Code Execution Vulnerability(36731)
    
por Watermelon 27.01.2015 / 16:48

3 respostas

4

Sim, você pode fazer isso no bash, mas não tenho ideia do porquê você gostaria. Aqui está uma solução pura:

$ while read -r mon day time host threat date time crit count sugg out exip \
                in inip tcp port export cat vuln; do 
     printf "%s | " "$mon $day $time" "$host" "$threat" "$date $time" \ 
                    "$crit $count $sugg" "$out $exip" "$in $inip" "$tcp \
                    $port" "$export" "$cat" "$vuln"
  done < file; printf "\n"
Jan 21 11:10:44 | hostname.internal.nl | THREAT | 2015/01/21 11:10:44 | critical 5 reset-both | outside 10.10.10.10 | inside 10.16.61.4 | tcp 39898 | 80 | web-browsing | any Bash Remote Code Execution Vulnerability(36731) | 

Eu poderia te dar melhores maneiras em perl ou awk, mas elas dependerão de como exatamente você define seus campos. Se você atualizar sua pergunta com mais detalhes (por exemplo, sempre haverá três palavras no campo crítico? Precisamos saber o que sempre será o mesmo em sua entrada e o que pode mudar), eu posso lhe dar uma solução melhor.

    
por 27.01.2015 / 17:19
0

Se as linhas de entrada forem do mesmo tipo, você pode fazer assim:

#!/bin/bash

LOG="/root/1.txt"

echo "Date | Hostname | Threat | DATE+time | Critical/High | Count | --- | External IP | Internal IP | TCP/UDP | Port | External Port | Category | Vulnerability" > 1.csv

< $LOG awk '{print $1" "$2" "$3 " | " $4 " | " $5 " | " $6" "$7 " | " $8" "$9" "$10 " | " $11" "$12 " | " $13" "$14 " | " $15" "$16 " | " $17 " | " $18 " | " $19" "$20" "$21" "$22" "$23" "$24}' >> 1.csv

Entrada:

Jan 21 11:10:45 hostname.internal.nl THREAT 2015/01/21 11:10:44 critical 5 reset-both outside 10.10.10.10 inside 10.16.61.4 tcp 39898 80 web-browsing any Bash Remote Code Execution Vulnerability(36731)

Jan 22 11:12:45 hostname2.internal.nl THREAT2 2015/01/22 12:10:44 critical2 52 reset-both2 outside2 10.10.10.12 inside2 10.16.61.42 udp 39899 82 web-browsing2 any2 Bash Remote Code Execution Vulnerability(36731)2

Saída:

Date | Hostname | Threat | DATE+time | Critical/High | Count | --- | External IP | Internal IP | TCP/UDP | Port | External Port | Category | Vulnerability
Jan 21 11:10:45 | hostname.internal.nl | THREAT | 2015/01/21 11:10:44 | critical 5 reset-both | outside 10.10.10.10 | inside 10.16.61.4 | tcp 39898 | 80 | web-browsing | any Bash Remote Code Execution Vulnerability(36731)
Jan 22 11:12:45 | hostname2.internal.nl | THREAT2 | 2015/01/22 12:10:44 | critical2 52 reset-both2 | outside2 10.10.10.12 | inside2 10.16.61.42 | udp 39899 | 82 | web-browsing2 | any2 Bash Remote Code Execution Vulnerability(36731)2
    
por 28.01.2015 / 09:39
0

Achei isso muito útil para coletar arquivos de log do S3 Cloudfront e carregá-los no Google Drive.

Eu usei o awscli no Mac-Os depois de instalar isso com o awscli do homebrew. Eu corri o comando:

aws s3 sync s3://bucketname/domain/ .

O bucket foi preenchido com logs do cloudfront (eu ligo isto na edição do cloudfront) e todos os arquivos foram puxados para o meu computador local. Eu corri descompactado nos arquivos .gz e tenho arquivos de texto.

Depois disso, na mesma pasta, usei o comando find + exec para criar um arquivo de log grande, conforme descrito abaixo. Depois disso, dividi o log no formato de log do cloudfront e gerou um arquivo CSV usando vírgulas como uma divisão no awk. Este CSV foi enviado para o Google Drive para algumas análises dinâmicas e me ajudou a encontrar bordas ruins e arquivos ausentes.

Este é o script bash que usei para isso:

'#!bash/bin
#Join Logs into one Big File using cat , if there are any default  headers on your files . you need to remove them
FILE_NAMES_START = 'E1I*'
find . -type f -name FILE_NAMES_START -exec cat {} + >> big_log_file.txt
#Output Log File 
LOG="big_log_file.txt"
echo "DATE , TIME , X-Edge-Location , SC-Bytes , Client-IP , Method , Cs-Host , File-URI , HTTP Status , Referer , User Agent , URI Query , Cookie-Id , Edge-Result , Edge-Request-ID , Host Header , Protocol , Bytes , Time Taken , X-Forwader , SSL Protocol , SSL Cipher , CDN-Result-Type" >> csv_data.csv
< $LOG awk '{print $1 " ,  " $2" ,  " $3 " , " $4 " , " $5 " , " $6 " , " $7 " , " $8 " , " $9 " , " $10 " , " $11 " , " $12 " , " $13 " , " $14 " , " $15 " , " $16 " , " $17 " , " $18 " , " $19 " , " $20 " , " $21 " , " $22 " , " $23 " , " $24}' >> big_csv_file.csv'

Verifique se os arquivos txt e este código bash estão na mesma biblioteca ou adicione o necessário / ao script.

csv > 100Mb não funciona tão bem nas planilhas do Google.

    
por 18.06.2016 / 13:32