[gelöst] Bash-Scripting

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
wotan
Beiträge: 113
Registriert: 16.03.2004 20:41:04

[gelöst] Bash-Scripting

Beitrag von wotan » 16.04.2009 21:44:44

Folgendes Problem:

Ich brauche für den Aufruf von rrdtool zwei Timestamps die ich zur Scriptlaufzeit berechnen muss.
Das Heisst ich brauch den Timestamp für den 1. des Monats und für den letzten des Monats.
Beispiel:
first = 01.04.2009 00:00:00 => 1238536800
last = 30.04.2009 23:59:59 => 1241128799

Code: Alles auswählen

#!/bin/bash
first=$(date +%Y%m)01;
last=date -d "$(date -d month +%Y-%m-1) -1 day" +%d;
t=`date -d "$first" +%s`;
s=`date -d "$last" +%s`;
echo $t;
echo $s;
Kann mir hier vielleicht jemand unter die Arme greifen und Helfen?
Zuletzt geändert von wotan am 17.04.2009 00:08:09, insgesamt 1-mal geändert.
mfg
wotan

yeti

Re: Bash-Scripting

Beitrag von yeti » 16.04.2009 23:50:36

Code: Alles auswählen

#!/bin/bash

t1 ()
{   
    date -d $(date +%Y-%m-01 "$@") +%s
}

t2 ()
{   
    local monat=$(date +%m "$@") jahr=$(date +%Y "$@") sek;
    case $monat in
        12) 
            sek=$(date -d $((jahr+1))-01-01 +%s)
        ;;
        *)  
            sek=$(date -d ${jahr}-$((monat+1))-01 +%s)
        ;;
    esac;
    echo $((sek-1))
}

cat<<dog
Testdatum   t1_soll     t2_soll
            t1_ist      t2_ist

2008-12-10  $(date -d 2008-12-01 +%s)  $(date -d "2008-12-31 23:59:59" +%s)
            $(t1 -d 2008-12-10)  $(t2 -d 2008-12-10)

2009-04-15  $(date -d 2009-04-01 +%s)  $(date -d "2009-04-30 23:59:59" +%s)
            $(t1 -d 2009-04-15)  $(t2 -d 2009-04-15)

2009-12-18  $(date -d 2009-12-01 +%s)  $(date -d "2009-12-31 23:59:59" +%s)
            $(t1 -d 2009-12-18)  $(t2 -d 2009-12-18)
dog
2008 war mit einer zusätzlichen Schaltsekunde am Jahresende gesegnet?
Dann müsste eigentlich der erste Test um eine Sekunde falsch liegen...

...hab ich sonst nochwas überseh'n?

Naja... zumindest als erste Diskussionsgrundlage ist es wohl brauchbar...

...achja... für den normalen Einsatz t1 und t2 ohne das zusätzliche "-d"-Zeugs benutzen... das "-d"-Zeugs ist nur zum Testen manuëll angegebener Daten, ohne Dieses wird das aktuëlle Datum benutzt...

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: Bash-Scripting

Beitrag von GoKi » 16.04.2009 23:56:59

Nur mal so als Idee:
t1:

Code: Alles auswählen

date -d "$(date +%F) - $(date +%d) days + 1 day" +%s
t2:

Code: Alles auswählen

date -d "$(date +%F) - $(date +%d) days + 1 month + 86399 seconds" +%s
date -d "$(date +%F) - $(date +%d) days + 1 month + 1 day - 1 second" +%s
Zuletzt geändert von GoKi am 16.04.2009 23:59:35, insgesamt 1-mal geändert.
MfG GoKi
:wq

Benutzeravatar
wotan
Beiträge: 113
Registriert: 16.03.2004 20:41:04

Re: Bash-Scripting

Beitrag von wotan » 16.04.2009 23:57:11

@yeti

Kannst du bitte mal den Code-Block unterteilen ind Script- und Consolen-Bereich.
mfg
wotan

Benutzeravatar
wotan
Beiträge: 113
Registriert: 16.03.2004 20:41:04

Re: Bash-Scripting

Beitrag von wotan » 17.04.2009 00:01:13

@GoKi
Danke das ist es.

[Edit]
Nur der Vollständigkeithalber:

Code: Alles auswählen

#!/bin/bash
first=`date -d "$(date +%F) - $(date +%d) days + 1 day" +%s`;
last=`date -d "$(date +%F) - $(date +%d) days + 1 month + 86399 seconds" +%s`;

VRX=`rrdtool fetch DATEI.rrd AVERAGE -r 3600 --start "$first" --end "$last" |perl -ne '/^(\d+):/; print if $1 % 3600 == 0;' |perl -e '
while (<>) {
  next unless /^\d+:\s+ ([\d\.\+e]+)\s+ ([\d\.\+e]+)/xi;
  push (@sample, [ $1*8, $2*8 ]);
}
@sample_rx = sort { $b->[0] <=> $a->[0] } @sample;
printf "%f", $sample_rx[@sample_rx/20][0];
'`
Zuletzt geändert von wotan am 17.04.2009 00:06:41, insgesamt 2-mal geändert.
mfg
wotan

yeti

Re: Bash-Scripting

Beitrag von yeti » 17.04.2009 00:02:13

wotan hat geschrieben:@yeti
Kannst du bitte mal den Code-Block unterteilen ind Script- und Consolen-Bereich.
???

Zum Testen erstmal alles in ein Skript packen und einfach laufenlassen...
Wenn Du die Funktionen in Kommandozeilen brauchst, dann steck sie in eine eigene Datei und lad sie mit "source dateiname_evtl_mit_pfad" in der Kommandozeile...

Benutzeravatar
hikaru
Moderator
Beiträge: 13934
Registriert: 09.04.2008 12:48:59

Re: Bash-Scripting

Beitrag von hikaru » 17.04.2009 08:57:19

OT:
yeti hat geschrieben:2008 war mit einer zusätzlichen Schaltsekunde am Jahresende gesegnet?
Ja.
Die 34. um genau zu sein.

yeti

Re: Bash-Scripting

Beitrag von yeti » 17.04.2009 10:16:27

hikaru hat geschrieben:OT:
yeti hat geschrieben:2008 war mit einer zusätzlichen Schaltsekunde am Jahresende gesegnet?
Ja.
Die 34. um genau zu sein.
...nur Haarspalter und Erbsenzähler werden nachschauen, ob date diese Sondersekunde berücksichtigte und evtürell ihr Skript anpassen wollen?

Schon doll, was heut zutage alles OTlich ist... :P

Antworten