imprimir de um horário específico em um tempo de log

1

Eu escrevi um script para imprimir 5 dias antes do final de um arquivo de log! e agora eu quero alterá-lo de alguma forma para imprimir 5 horas antes do final do arquivo!

este é o script:

for d in \
 $(sed -nre 's/.*\[(..)\/(...)\/(....):(..:..:..) .*/   /p' thttpd.log | date +%s -f-);
do echo $d >s1; done

time=$(expr 60 \* 60 \* 24 \* 5)
EDATE='tail -1 s1'
SDATE=$[$EDATE - $time]
sd='date -d '1970-01-01 UTC '$SDATE' seconds' +"%d/%b/%Y"'
echo $sd
awk -F'[:[]' -v vd=$sd 'BEGIN{ gsub(/\//," ",vd);"date +%s -d \""vd"\""|getline d} {p=$0;  gsub(/\//," ",$2); "date +%s -d \""$2"\""|getline o;if(o>d) print p}' ll.log

exemplo de arquivo de log:

213.64.153.92 - - [26/Sep/2002:00:15:15 +0200] "GET/scripts/..%c0%af../winnt/system32/cmd.exe?/c+dir HTTP/1.0" 404 - "" ""
213.64.153.92 - - [26/Sep/2002:00:15:16 +0200] "GET/scripts/..%c1%9c../winnt/system32/cmd.exe?/c+dir HTTP/1.0" 404 - "" ""
    
por matarsak 28.09.2011 / 19:17

1 resposta

1

Uma sugestão, o comando de data GNU (encontrado na maioria dos sistemas Linux) pode ter uma expressão de data:

  date --date='today-7 days 0000'   ;; print 7 days earlier than today at 0000

  date --date='26 Sep 2002 00:15:16 -5 hours'  ;; closer to your example

Isso pode facilitar o seu script.

Assim, o processamento seria: (1) obter a data de início e formatá-la (2) localizar o ponto no arquivo e (3) imprimir. Isso pode ser feito de várias maneiras, provavelmente com uma simples declaração sed no arquivo de log.

EDITAR ADDIÇÃO:

Especificamente, isso deve funcionar: (não é garantido que será totalmente testado, mas funciona!)

 #! /bin/sh
 set -uh

 filename=/var/log/apache2/access_log

 lastdate='tail -1 $filename | sed 's/^.*\[//
 s/\].*$//
 s/ .*$//
 s/\// /g
 s/:/ /''
 newdate='date --date="$lastdate -5 hours" +"%d\/%b\/%Y:%H:"'
 awk '/'"$newdate"'/,/^$/    {print $0}' $filename

 exit 0
    
por 28.09.2011 / 19:45