Sed, arquivo de log Awk Multiline, um número {0-999] identifica a relação

1

Versão resumida do problema:
Precisa extrair de logs: {Usando sed e awk no Linux}
Time, PlayerName {pode ter muitos caracteres especiais}, GUID, IP do exemplo de log no final.

Versão mais longa:
Como combinar 2 linhas de arquivo de log SE o número do jogador no ponto “próximo” no tempo coincidir com a próxima linha.

Este número só é válido até o jogador desconectar.
O número será usado pelo novo jogador.
Isso cria um problema especial ilustrado com: Jogador # 106 sendo 4 linhas, ainda se refere a dois jogadores diferentes.

Progresso até aqui.
Lendo manuais e fóruns. Já extrai campos de dados individuais e os escreve no mysql.

Mas, realmente preciso registrar dados juntos como um relevante:
O que jogador com o que IP e o GUID está conectado no que tempo .
Estes dados só podem ser obtidos combinando duas linhas se o número do jogador corresponder perto do ponto no tempo como eu posso ver.

Exemplo de log:

23:57:20 : Player #29 Simplename (10.21.23.32:2304) connected  
23:57:22 : Player #29 Simplename - GUID: 1234567890abcdef123456789aaaaa00 (unverified)
23:56:13 : Player #106 [Som(e) name]  Gabriel (10.21.23.33:2304) connected  
23:56:15 : Player #106 [Som(e) name]  Gabriel - GUID: 1234567890abcdef123456789bbbbb00 (unverified)  
23:56:51 : Player #106 [gp0] SomeN@me 123  (10.21.23.34:2304) connected  
23:56:52 : Player #106 [gp0] SomeN@me 123  - GUID: 1234567890abcdef123456789aaaaa02 (unverified)  
23:57:18 : Player #20 [gp0] SomeN@me 123  (10.21.23.44:2304) connected  
23:57:19 : Player #20 [gp0] SomeN@me 123  - GUID: 1234567890abcdef123456789aaaaa03 (unverified)  
23:57:51 : Player #6 <<t>> 'N@me5_Can=Be..Hard (10.21.23.32:2304) connected  
23:57:53 : Player #6 <<t>> 'N@me5_Can=Be..Hard - GUID: 1234567890abcdef123456789aaaaa04 (unverified)  
    
por fun6utzi 17.04.2016 / 05:21

1 resposta

2

assumindo que o IP e o GUID tenham uma posição fixa

/connected/ {
  name = substr($0,index($0,$4)+length($4)+1) ;
  nip=NF-1 ;
  name = substr(name,1,index(name,$nip)-2) ;
  session[$4]=name ;
  connected[name]=$0 ;
  ip[name]=$nip ;
}

/GUID/ {
  if ( $4 in session ) {
    ngu = NF-1 ;
    guid=$ngu ;
    printf "%s - %s - %s -%s\n",$1,session[$4],guid,ip[session[$4]] ;

    delete session[$4] ;
  }

}
  • sem branco no IP, GUID ...
  • o nome é capturado na conexão
  • Demorei na linha GUID, registrando o tempo de conexão que pode ser salvo da mesma maneira que para o IP.
  • Saí como exercício para remover ( :2304) do IP ...

como resultado

23:57:22 - Simplename - 1234567890abcdef123456789aaaaa00 -(10.21.23.32:2304)
23:56:15 - [Som(e) name]  Gabriel - 1234567890abcdef123456789bbbbb00 -(10.21.23.33:2304)
23:56:52 - [gp0] SomeN@me 123  - 1234567890abcdef123456789aaaaa02 -(10.21.23.34:2304)
23:57:19 - [gp0] SomeN@me 123  - 1234567890abcdef123456789aaaaa03 -(10.21.23.44:2304)
23:57:53 - <<t>> 'N@me5_Can=Be..Hard - 1234567890abcdef123456789aaaaa04 -(10.21.23.32:2304)

Nota:

  • a sessão # 99 pode ser entrelaçada, mas não com o mesmo número.
  • O código
  • pode ser alterado para entrar no nome do jogador.

MAS

  • você não pode misturar o número da sessão E ter o mesmo nome de jogador.
por 17.04.2016 / 09:35