Extrair seqüências de caracteres do arquivo de registro da Web

0

Dado um arquivo contendo registros de acesso à web para um vídeo do YouTube, cada linha é um hit e está no formato.

62.172.72.131 - - [02/Jan/2003:02:06:41 -0700] "GET /random/html/riaa_hacked/ HTTP/1.0" 200 10564 "-" "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 4.0; WWP 17 August 2001)"    
63.194.21.74 - - [30/Apr/2003:13:13:22 -0700] "GET /random/video/Star_Wars_Kid_Remix.wmv HTTP/1.1" 206 1146708 "-" "NSPlayer/9.0.0.2980 WMFSDK/9.0"    
161.114.88.73 - - [02/May/2003:03:27:41 -0700] "GET /random/video/Star_Wars_Kid.php HTTP/1.0" 302 1 "http://friends.portalofevil.com/sp.php?si=3&fi=FRIENDSOF&ti=1000489621&pi=1000489621" "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0; compaq)"    
64.164.63.70 - - [02/May/2003:13:24:19 -0700] "GET /random/video/Star_Wars_Kid.wmv HTTP/1.1" 302 307 "http://blogdex.media.mit.edu/" "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 4.0)"

Eu preciso extrair o endereço IP e a data no colchete e colocá-lo em um arquivo csv, por exemplo, ip_address,date

Estou usando os seguintes comandos para obter o IP e a data, respectivamente

grep -oP '([0-9]{1,3}\.){3}[0-9]{1,3}' test.log
grep -oP "\[\K[^\]]+" test.log

Eu não sei como combiná-lo em 1 string para colocá-lo em um csv

tr '\n' > file.csv

Como esse é um arquivo de log grande, eu pensei que os comandos unix lidariam com isso de maneira eficiente. Existe uma diferença entre usar comandos unix ou programá-lo em python (ler cada linha, manipular a string e depois gravar no arquivo)?

    
por Bryce Ramgovind 28.02.2016 / 14:28

3 respostas

1

Você faria melhor usando o awk,

awk '{print $1,$4,$5;}' test.log

awk divide cada linha no espaçamento, permitindo que você se refira aos campos como $1 , $2 , ... etc e imprime o primeiro, quarto e quinto campos ( $4 e $5 compõe o carimbo de data).

    
por 28.02.2016 / 15:01
0

Use substituições de RE em sed , aqui , , ... são atribuídos os valores entre \( e \)

correspondentes
sed 's/\([0-9\.]\) - - \[\(.*\)\] "GET .*/, /' test.log

(com certeza você pode substituir um padrão mais exato entre parênteses)

    
por 28.02.2016 / 14:59
-1

Com um comando unix você pode usar o seguinte sed

sed -e 's/\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*\[\(.*\)\].*/\t/' test.log

Mas se o arquivo de log for muito grande, acho que seria melhor usar o Python, pois ele pode manipular ações em arquivos grandes de forma mais eficaz com, por exemplo, a biblioteca fileinput ou um gerador.

    
por 28.02.2016 / 15:04