: ########################################################################## # Shellscript: logstat - generate log report # Version : 2.0 (beta) # Project : # Author : Heiner Steven (heiner.steven@odn.de) # Date : 12/13/93 # SCCS-Id. : $Id: logstat,v 1.1.1.1 1999/06/15 19:29:05 heiner Exp $ ########################################################################## # Description # ########################################################################## PN=`basename $0` # program name VER='2.0 (beta)' Usage () { echo "$PN - short description $VER (stv '94)" exit 1 } Msg () { for i do echo "$PN: $i" >&2 done } Fatal () { Msg "$@"; exit 1; } : ${LOGDAT:=${LOGDIR:=$HOME/lib}/log} : ${TMPDAT:=$LOGDIR/$$.tmp} : ${AWK:=nawk} while [ $# -gt 0 ] do case "$1" in -f) LogDat="$2"; shift;; --) shift; break;; -h) Usage;; -*) Usage;; esac shift done : ${LogDat:=$LOGDAT} [ -r "$LogDat" ] || Fatal "cannot read $LogDat" : ' EIN: 03.06.1994 10:47:15 (Fri) AUS: 03.06.1994 19:40:52 (Fri) EIN: 06.06.1994 10:23:58 (Mon) AUS: 06.06.1994 17:06:44 (Mon) ' $AWK ' # Seconds - return seconds since 00:00:00 # Seconds ("10:47:13") = 38835 function Minutes (TimeStr) { if ( (k = split (TimeStr, T, ":")) < 2 || k>3 ) return -1; return T [1]*60 + T[2] } # TimeDiff - calculate elapsed time between Start and End # Return: # Hours elapsed hours # Mins epapsed Minutes (roundet to quarter-hours) function TimeDiff (Start, End) { Hours = Mins = 0 if ( (M = End - Start) < 1 ) return 0 Hours = int (M / 60) Mins = int (M % 60) Quart = int (Mins / 15) # round up to the next quarter-hour if ( (Mins%15) > 7 && Quart<4 ) Quart++ if ( Quart > 3 ) { Hours++; Quart=0; } Mins = Quart * 15 } # CheckLine - return 1 if invalid function CheckLine (Line) { if ( NF!=4 || ($1!="EIN:" && $1!="AUS:") || DayInd [$4]=="" ) return 1 return 0 } function WeekTotals () { wtHours += int (wtMins / 60) wtMins %= 60 printf "Wochensumme %3d %02d\n", wtHours, wtMins mtHours += wtHours mtMins += wtMins wtHours = wtMins = 0 } function MonthTotals () { if ( wtHours>0 || wtMins>0 ) WeekTotals() mtHours += int (mtMins / 60) mtMins %= 60 print " ======" printf "Summe %s %3d %02d\n", Months [LastMonth+0], mtHours, mtMins mtHours = mtMins = 0 } BEGIN { # Translation table for Name of Day DayInd [""] = 0 DayInd ["(Sun)"] = 1 DayInd ["(Mon)"] = 2 DayInd ["(Tue)"] = 3 DayInd ["(Wed)"] = 4 DayInd ["(Thu)"] = 5 DayInd ["(Fri)"] = 6 DayInd ["(Sat)"] = 7 split ("So Mo Di Mi Do Fr Sa", Days) split ("Januar Februar Maerz April Mai Juni Juli August September Oktober November Dezember", Months) LastMonth = 13 # illegal month->no totals } $1 ~ /^#/ { next } # ignore comments $1 == "EIN:" { if ( CheckLine($0) ) { print "WARNING: illegal line " NR " ignored" | "cat >&2" next } StartDate = $2 StartTime = $3 if ( !getline ) exit 0 # end of file if ( $1!="AUS:" ) { print "WARNING: AUS: expected in line " NR " - ignored" | "cat >&2" next } if ( $2!=StartDate ) { print "WARNING: day changed in line " NR " - ignored" | "cat >&2" next } gsub ("[.]", " ", StartDate) gsub ("[.]", " ", $2) split (StartDate, Date) # Date[1]: Day, Date[2]: Month Date[3]:Year Month = Date [2] if ( Month > LastMonth ) { # change of month MonthTotals() # calls WeekTotals(), if necessary printf "\n\nMonat %s\n\n", Months [Month+0] } else if ( DayInd [$4] < DayInd [Yesterday] ) { # change of week WeekTotals() print "" } TimeDiff(Minutes(StartTime), Minutes($3)) printf "%s %s %s %s %3d %02d\n", Days [DayInd [$4]], StartDate, StartTime, $3, Hours, Mins wtHours += Hours # week totals wtMins += Mins Yesterday = $4 LastMonth = Month } END { WeekTotals() MonthTotals() } ' $LOGDAT exit 3 von="${1:-00.00.0000}" bis="${2:-99.99.9999}" : ${AWK:=awk} # Standard awk im Suchpfad # Die Standard awk-Version von SunOS 4.3.1 kann keine Funktionen. # Benutze stattdessen (wenn vorhanden) eine neuere Version: [ -x /bin/nawk ] && AWK=/bin/nawk # Format der Logdatei: # EIN: 13.12.1993 09:45:55 (Montag) # AUS: 13.12.1993 17:24:57 (Montag) cfcat $LOGDAT | $AWK ' function ParseLine() { Datum = $2; Zeit = $3; Tag = $4 gsub ("[()]", "", Tag) nDatum = split (Datum, aDatum, ".") if ( nDatum != 3 ) { print "Warnung: ungueltiges Datum wurde ignoriert (Zeile " NR ")" return 1 } nZeit = split (Zeit, aZeit, ":") if ( nZeit != 3 ) { print "Warnung: ungueltige Zeit wurde ignoriert (Zeile " NR ")" return 1 } NrDatum = aDatum [3] aDatum [2] aDatum [1] NrZeit = aZeit [3] + aZeit [2]*60 + aZeit [1]*3600 } function Runde (Sek) { if ( (Sek%Runden) >= Diff ) { Sek = (1 + int (Sek / Runden)) * Runden } else Sek = int (Sek / Runden) * Runden return Sek } BEGIN { OFS = "\t" VonDatum = "'$von'" BisDatum = "'$bis'" Runden = 15*60 # auf 1/4 h runden Diff = 5*60 # ab dieser Grenze runden if ( VonDatum == "" ) VonDatum = "00.00.0000" if ( BisDatum == "" ) BisDatum = "99.99.9999" if ( split (VonDatum, V, ".") != 3 || split (BisDatum, B, ".") != 3 ) { print "ungueltiges Datum angegeben!" Fehler = "ja" exit 1 } Von = V [3] V [2] V [1] Bis = B [3] B [2] B [1] GesamtSek = 0 GesamtTage = 0 print "Tag", "", "Datum", "", "Ein", "", "Aus", "", "Zeit" } { if ( NF != 4 || split ($2, D, ".") != 3 ) { print "Warnung: ungueltige Zeile wurde ignoriert (Nr. " NR ")" next } AktDatum = D [3] D [2] D [1] } ( $1=="EIN:" && Von<=AktDatum && AktDatum<=Bis ) { if ( ParseLine() ) { print "Warnung: ungueltige Zeile wurde ignoriert (Nr. " NR ")" next } vDatum = Datum vZeit = Zeit vTag = Tag vd = NrDatum # "von Datum" vt = NrZeit if ( !getline || $1 != "AUS:" || ParseLine() ) { print "Warnung: ungueltige Zeile wurde ignoriert (Nr. " NR ")" next } if ( vDatum != Datum ) { print "Warnung: unerwartetes Datum (Zeilen sortiert?) (Zeile " NR ")" Fehler = "ja" exit 1 } bd = NrDatum # "bis Datum" bt = NrZeit s = (bt-vt) # Anzahl Sekunden s = Runde(s) Sekunden = s % 60 Minuten = int (s / 60) % 60 Stunden = int (s / 3600) printf ("%-10s\t%s\t%s\t%s\t%02.02d:%02.02d:%02.02d\n", Tag, vDatum, vZeit, Zeit, Stunden, Minuten, Sekunden); GesamtSek += s GesamtTage++ } END { if ( Fehler != "ja" ) { Sekunden = GesamtSek % 60 Minuten = int (GesamtSek / 60) % 60 Stunden = int (GesamtSek / 3600) printf ("%d Tag(e)\t\t\t\t\t\t\t%2.02d:%02.02d:%02.02d\n", GesamtTage, Stunden, Minuten, Sekunden); } } ' $LogDat if [ $? -ne 0 ] then # Fehler aufgetreten echo "$PN - Logdatei auswerten" echo "Aufruf: $PN [vondatum [bisdatum]]" echo echo "Ein Datum muss die Form tt.mm.jjjj haben." exit 1 fi