Divide o arquivo de log grande em partes com base na data

1

Estou tentando elaborar um comando do Linux para dividir um arquivo de log grande em partes com base na data.

Usando link como ponto de partida ponto, eu tentei:

awk '{ split($4,array,"/"); print > array[2] ".txt" }' TestLog.txt

No meu exemplo TestLog.txt com entradas para maio, junho e julho de anos diferentes, isso criou os arquivos de texto May.txt, Jun.txt e Jul.txt:

Para entender os valores nas matrizes, eliminei o arquivo de saída e exibi os valores da matriz usando:

awk '{ split($4,array,"/"); print  array[1] "  "  array[2] "  " array[3] "  " array[4] }' TestLog.txt

Onde as duas primeiras linhas de TestLog.txt são:

124.115.5.11 - - [30/May/2011:23:21:37 -0500] "GET / HTTP/1.0" 200 206492 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322;TencentTraveler)"
58.61.164.39 - - [31/May/2011:00:36:35 -0500] "GET / HTTP/1.0" 200 206492 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322;TencentTraveler)"

Isso resultou em [30 May 2011:23:21:37 para a primeira linha do arquivo.

Os resultados foram muito confusos para mim. Em particular:

  1. Por que array[1] é igual a [30 e não 124.115.5.11 - - [30 ?

  2. Por que array[3] é igual a 2011:23:21:37 e não 2011:00:36:35 -0500] "GET ?

  3. Por que array[4] null?

  4. Qual deve ser o valor de array[0] ?

por Mike 05.04.2016 / 02:02

1 resposta

3

Vamos pegar a primeira linha:

124.115.5.11 - - [30/May/2011:23:21:37 -0500] "GET / HTTP/1.0" 200 206492 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322;TencentTraveler)"

e a parte crucial do fragmento awk :

awk '{ split($4,array,"/") ...

Aqui está o que está acontecendo:

  • awk executa e divide a linha nos espaços (separador de campo padrão)
  • O campo 4 th na linha também está sendo dividido em / character
  • o resultado da divisão é colocado no array
  • mais tarde, toda a linha é impressa no arquivo denominado como um segundo subcampo ( array[2] ) do quarto campo

então $4 campo continha inicialmente [30/May/2011:23:21:37 e depois da divisão nós temos

array[1]=[30
array[2]=May
array[3]=2011:23:21:37

Não há array[4] , porque o campo 4 th não contém 4 th "subcampo" e não há array[0] porque em awk os índices de array começam em 1.

    
por 05.04.2016 / 02:17