Script em gAWk para subtrair horas de uma data.

Iniciado por Lex Luthor, 03 de Abril de 2009, 10:58

tópico anterior - próximo tópico

Lex Luthor

Amigos,

    Estou com um problema aqui.
    Tenho um serviço que me gera uns logs, que de vez em quando eu preciso fazer uma pesquisa nesses logs.
    Como eles são muitos, resolvi fazer um script para enviá-los a um banco de dados postgress.
    O script basicamente dá um zipgrep no arquivo de logs procurando um código específico e manda essa linha para o AWK tratar e gerar um SQL para o BD.

    O problema é o seguinte: no BD, eu tenho uma tabela com 5 campos:
         1) data_inicial (date)
         2) hora_inicial (time without timezone)
         3) data_final (date)
         4) hora_final (time without timezone)
         5) Horas totais (string)

     A linha do Log só me passa a data/hora FINAL e as horas totais (no formato HH:MM:SS, sendo que HH pode ser qualquer número. Ex.: 150:40:25). Daí eu preciso calcular quando foi a hora inicial/final para inserir no BD....

      Eu fiz um script e parecia estar funcionando direitinho, mas depois notei que o meu cálculo está com algum problema, pois as datas iniciais estavam erradas. Acho que pode ser alguma coisa com TimeZone, mas não consegui descobrir ainda....

      Gostaria de saber se tem algum guru em AWK aqui para me ajudar...

      Como foi minha idéia principal:
        1) Peguei a data do dia0 (1970-01-01)
        2) Divido as horas totais por 24 para saber quantos dias a mais devo adicionar no dia0
        3) depois de adicionar no dia, gero um timestamp para essa data. (mktime)
        4) gero um timestamp para a data_final (mktime)
        5) Subtraio os dois timestamps
        6) Gero a data inicial com srttime

Abaixo, partes do código:
retencao: total de horas que tenho que subtrair.

   
      dia0="1970-01-01"
      split(dia0, dia0_split, "-")
.
.
.
# Agora fazemos o calculo para achar a hora de atribuicao do IP
  split(retencao, retencao_split, ":")
  horas_retencao = retencao_split[1]
  dias = int(horas_retencao / 24);
  resto_horas_retencao = horas_retencao % 24;
  dia0_dia = dias+1;
  retencao_timestamp = mktime(dia0_split[1]" "dia0_split[2]" "dia0_dia" "resto_horas_retencao" "retencao_split[2]" "retencao_split[3]" 0")

  split(data_final, data_f_split, "-")
  split(hora_final, hora_f_split, ":")
  hora_termino_timestamp = mktime (data_f_split[1]" "data_f_split[2]" "data_f_split[3]" "hora_f_split[1]" "hora_f_split[2]" "hora_f_split[3]" 0")
  hora_inicio_timestamp = hora_termino_timestamp - retencao_timestamp

  hora_inicio_str=strftime("%F %T", hora_inicio_timestamp)
  split(hora_inicio_str, data_split, " ")
  data_inicio = data_split[1]
  hora_inicio = data_split[2]




Agradeço antecipadamente qualquer ajuda, inclusive formas mais fáceis de fazer isso....
Analista de Redes- Segurança da Informação
Bacharel em Ciências da Computação - UnB
Ubuntu Forever - Compiz Fusion -