Gå til innhold

Bash - Ta ut siste 24 timene fra /var/log/***


Anbefalte innlegg

Hei,

 

Jeg holder på å lage noen små script som skal overvåke log filene i /var/log/***

 

Nov  30 12:09:20 HOST service [xxxxx] - Logged message....
Dec  1 00:09:20 HOST service [xxxxx] - Logged message....
Dec  1 05:09:20 HOST service [xxxxx] - Logged message....
Dec  1 10:11:12 HOST service [xxxxx] - Logged message....
Dec  1 13:09:20 HOST service [xxxxx] - Logged message....

 

Jeg prøver da å få de siste 24 timene, men dette er tydeligvist ikke så lett.

Har funnet en metode, men den er ubrukelig og har masse "hull"....

 

Noen som har noen gode forslag på hvordan man skal få ut de siste 24 timene med entries fra en logg fil?

Lenke til kommentar
Videoannonse
Annonse

Hvorfor prøver du ikke selv? :p Driver aldri med bash selv, men synes det er morsomt å knekke "nøtter" som denne, så etter litt om og men fikk jeg dette til:

#!/bin/bash

DATELIMIT=`date +%s`
DATELIMIT=$((DATELIMIT-86400))

while read line
do 
set -- $line
MONTH=$1
DAY=$2
TIME=$3
LOGDATE=`date -d "$MONTH $DAY $TIME" +%s`
if [ $LOGDATE -gt $DATELIMIT ]; then
	echo $line
fi
done < $1

 

Som gir output:

[peter@aasen ~]$ ./d testfil
Dec 1 00:09:20 HOST service [xxxxx] - Logged message....
Dec 1 05:09:20 HOST service [xxxxx] - Logged message....
Dec 1 10:11:12 HOST service [xxxxx] - Logged message....
Dec 1 13:09:20 HOST service [xxxxx] - Logged message....
[peter@aasen ~]$

Lenke til kommentar

Jeg har prøvd, men fikk det ikke til. Jeg ser tankegangen i scriptet, men får det forsatt ikke til å fungere.

date -d ser ikke til å fungere som forventet.

 

fra man date så ser jeg at -d skal være;

-d dst Set the kernel's value for daylight saving time. If dst is non-

zero, future calls to gettimeofday(2) will return a non-zero for

tz_dsttime.

 

Regner med det er gettimeofday som nøkkel ordet her...

 

Men jeg får nemlig

./script.sh: line 13: [: -gt: unary operator expect

når jeg kjører script snutten...

 

Får heller ikke forventet svar når jeg kjører `date -d "Dec 04 11:17 1228385858",

får da bare beskjed om at "usage: date .......) så er tydeligvis feil format..

 

Skal tittet litt på det senere, men har noen en god ide så si gjerne i fra.

Endret av p0ker
Lenke til kommentar
Post det du har til nå, da.

 

Kan se ut som vi har forskjellige versjoner av date eller noe...

	   -d, --date=STRING
		  display time described by STRING, not ‘now'

 

Er fra en FreeBSD 7.0 Server, så date er forskjellig ja. Har ikke fått sett noe mer på det enda.

Skal ta en titt på det i kveld.

Lenke til kommentar

Har tittet mer på problemet, og kommer fortsatt ikke videre.

Skulle jeg bruke noe av måte du har tenkt her, så er jeg manuelt nødt å gjøre ut regningen.

 

if [ $1 == "dec" ]; then

month="xValue"

fi

 

Etc for alle mnd og da er jeg jo like langt. Ikke sikker på om det er mulig, uten å kode deg ihjel!

 

Så da spør jeg igjen, noen andre gode forslag?

(Er nesten sikker på at jeg kunne bygd et hus, på den tiden jeg har brukt for å google problemet...)

Lenke til kommentar

Installerte freebsd i virtualbox og prøvde meg litt fram:

 

#!/usr/local/bin/bash

echo "reading file $1 ..."
CURRENTTIME=`date +%s`
CURRENTTIME=$(($CURRENTTIME-86400))
echo "current time $CURRENTTIME"

while read line
do
set -- $line
MONTH=$1
DAY=$2
TIME=$3
LINETIME=`date -j -f "%b %d %T" "$MONTH $DAY $TIME" "+%s"`
if [ $LINETIME -gt $CURRENTTIME ]; then
	echo $line
fi
done < $1

 

Ser ut til å fungere, fikk ikke kopiert over, så kan være skriveleif.

Du kan jo korte den en del ned pga alle variablene strengt tatt ikke er nødvendig. :)

Endret av Blackslash
Lenke til kommentar

Var en lite skriveleif;

 

#!/usr/local/bin/bash

echo "reading file $1 ..."
CURRENTTIME=`date +%s`
CURRENTTIME=$(($CURRENTTIME-86400))
echo "current time $CURRENTTIME"

while read line
do
set -- $line
MONTH=$1
DAY=$2
TIME=$3
LINETIME=`date -j -f "%b %d %T" "$MONTH $DAY $TIME" +"%s"`
if [ $LINETIME -gt $CURRENTTIME ]; then
	echo $line
fi
done < $1

 

LINETIME=`date -j -f "%b %d %T" "$MONTH $DAY $TIME" +"%s"`

Måtte dytte en " et hakk.. :)

 

Men fikk det ikke til å funke med en gang. Har engelsk i fila jeg skal lese, og `date` spytter ut norsk.... Dvs at jeg fila jeg leser sier nå "dec" mens date vil ha "des".....

 

Litt usikker, men jeg mener å ha lest et eller anna sted at date kan manipulere for å bruker forskjellige tegnsett,

Titter på det nå. I værstefall kan jeg kjøre case på $1 for å konvertere...

 

Men takker for super hjelp!

Nå har jeg faktisk noe jeg kan bruke. :)

 

***update**

Jeg har jukset litt, tok en export... :)

Endret av p0ker
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...