Danke Schön!
shellscript
- detlef
- Geschlossen
-
-
So nun habe ich auch mal eine Frage.
Ich schreibe gerade ein kleines Skript das ich wenn ich bei der Arbeit bin starte und das ich nochmal starte wenn ich wieder von der Arbeit weg gehe.
Soll in etwa eine Zeiterfassung werden.
Die Uptime geht nicht, da ich den Rechner meist durchlaufen lasse.beim komme schreibe ich die aktuelle Zeit in eine Datei
Beim gehen schreibe ich die aktuelle Zeit in die selbe Datei
Das sieht dann so aus.20.03.2007 09:43 <-> 18:30
Soweit geht auch alles.
Nun will ich aber später mal ausrechnen wie lange ich da war.
Dazu muss ich 18:30 minus 9:43 Rechnen.
Genau um das Rechnen geht es nun.
Wie mache ich das?
Wie kann man das in der Shell am einfachsten machen? -
Eine Variante wäre so:
Bash
Alles anzeigen#!/bin/bash beginn="9:43" ende="18:30" stunden=0 # umrechnen in minuten s1=$(echo $beginn | cut -f 1 -d ":") m1=$(echo $beginn | cut -f 2 -d ":") (( gm1 = s1 * 60 + m1 )) s2=$(echo $ende | cut -f 1 -d ":") m2=$(echo $ende | cut -f 2 -d ":") (( gm2 = s2 * 60 + m2 )) # arbeitszeit in minuten (( minuten = gm2 - gm1 )) # arbeitszeit in stunden und minuten while [ $minuten -ge 60 ] ; do (( minuten = minuten - 60 , stunden = stunden + 1 )) done echo "Puh, Feierabend -> Heute waren es $stunden Stunden und $minuten Minuten"
-
danke. geht fast ganz gut.
Nur leider wenn ich start auf
beginn="09:43"
setze, dann gibt es Probleme. -
Moin moin,
oder in perl:
Perl
Alles anzeigen#!/usr/bin/perl use strict; use Date::Calc qw/Delta_DHMS/; my $h_total = 0; my $m_total = 0; open( FILE, "datei" ); while (<FILE>) { chomp($_); if ( $_ =~ /^(\d\d)\.(\d\d)\.(\d\d\d\d) (\d\d)\:(\d\d) <-> (\d\d)\:(\d\d)$/ ) { my ($Dd,$Dh,$Dm,$Ds) = Delta_DHMS( $3,$2,$1, $4,$5,'00', $3,$2,$1, $6,$7,'00' ); $h_total += $Dh; $m_total += $Dm; print $_ . ': ' . $Dh . ':' . $Dm . "\n"; } } close ( FILE ); printf( "Gesamt: %d:%02d\n", int( $h_total + $m_total / 60 ), ( $m_total % 60 ) );
Gruß
Merten
-
So das reicht erstmal.
Bash
Alles anzeigen#!/bin/bash TIMEFILE=~/timefile.log TODAY=`date +%d.%m.%Y` NOW=`date +%H:%M` function come() { echo >> $TIMEFILE echo -n "$TODAY $NOW <-> " >> $TIMEFILE } function go() { echo -n $NOW >> $TIMEFILE } function day() { START=`tail -n1 $TIMEFILE | cut -d" " -f2` STOP=$NOW stunden=0 # umrechnen in minuten s1=$(echo $START | cut -f 1 -d ":" | sed s/^0//) m1=$(echo $START | cut -f 2 -d ":" | sed s/^0//) (( gm1 = s1 * 60 + m1 )) s2=$(echo $STOP | cut -f 1 -d ":" | sed s/^0//) m2=$(echo $STOP | cut -f 2 -d ":" | sed s/^0//) (( gm2 = s2 * 60 + m2 )) # arbeitszeit in minuten (( minuten = gm2 - gm1 )) # arbeitszeit in stunden und minuten while [ $minuten -ge 60 ] ; do (( minuten = minuten - 60 , stunden = stunden + 1 )) done echo "Puh, Feierabend -> Heute waren es $stunden Stunden und $minuten Minuten" } case $1 in come) come; ;; go) go; ;; day) day ;; # week) week # ;; # month) month # ;; *) echo ungültige Auswahl ;; esac
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!