Назад | Перейти на главную страницу

печать с определенного времени в журнале времени

Я написал сценарий для печати за 5 дней до конца файла журнала! и теперь я хочу каким-то образом изменить его, чтобы печатать за 5 часов до конца файла!

это сценарий:

for d in \
 $(sed -nre 's/.*\[(..)\/(...)\/(....):(..:..:..) .*/\1 \2 \3 \4/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

пример файла журнала:

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 - "" ""

Предполагается, что команда даты GNU (встречается в большинстве систем Linux) может принимать выражение даты:

  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

Это может немного упростить написание сценариев.

Таким образом, обработка будет следующей: (1) получить дату начала и отформатировать ее (2) найти точку в файле и (3) распечатать. Это можно сделать разными способами, возможно, с помощью простого оператора sed в файле журнала.

ИЗМЕНИТЬ ДОПОЛНЕНИЕ:

В частности, это должно работать: (не гарантируется полное тестирование, но работает!)

 #! /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