Anzeige:
Ergebnis 1 bis 15 von 15

Thema: Shell: Fragen zu date und rrdtool

  1. #1
    Registrierter Benutzer Avatar von dilindam
    Registriert seit
    21.01.2004
    Beiträge
    15

    Shell: Fragen zu date und rrdtool

    Hallo,

    ich habe folgende Datei:
    ID: Datum Uhrzeit

    11: 2002-07-18 11:44:00
    11: 2002-08-31 05:17:00
    11: 2002-09-05 13:07:00
    11: 2002-09-23 19:13:00

    usw usw, ist bis heute datiert und auch mit anderen ID's.

    Diese Daten muss ich in eine RRD (Round Robin DB)einpflegen.

    Also wieviele 11er ID's vom 2002-07-18 bis heute. Die Uhrzeit ist unwichtig.

    Mein Script zum update der RRD sieht folgendermassen aus:

    #!/bin/sh
    export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    DATUM=`date +%Y-%m-%d`
    id11=`cat sortiert | grep '11: $DATUM'|wc -l`
    if [[ $id11 == '' ]] ; then id11=U ; fi
    /usr/bin/rrdtool update /home/tors/rrds/invention.rrd N:$id11

    'sortiert' ist die Datei die mir alle Einträge anzeigt. Wird täglich erneuert.
    Umfasst ca. 100.000 Einträge.

    Mit dem Skript zähle ich aber nun nur die heutigen Einträge.
    Wie kann ich alle alten Einträge noch abarbeiten?

    id11=`cat sortiert | grep '11: $1'|wc -l`

    und das skript starten mit:
    sh skript 2002-07-18
    ? Bringts nicht.

    id11=`cat sortiert | grep '11:2002-07-18 '|wc -l`
    bringt mir den gewünschten output.

    Ich kann ja auch nicht jedes Datum auf Konsole eintippen.
    Hat jemand Rat?


    MfG Torsten

  2. #2
    Registrierter Benutzer
    Registriert seit
    30.06.2005
    Beiträge
    155
    du musst bei deinem grep doppelte hochkommas verwenden
    Code:
    id11=`cat sortiert | grep "11: $1"|wc -l`
    religion is a virus from outer space

  3. #3
    Registrierter Benutzer Avatar von dilindam
    Registriert seit
    21.01.2004
    Beiträge
    15
    Zitat Zitat von ninguno
    du musst bei deinem grep doppelte hochkommas verwenden
    Code:
    id11=`cat sortiert | grep "11: $1"|wc -l`
    ja das funktioniert. Danke.

    Nun aber zum nächsten Schritt. Ich kann ja nicht jedes Datum da eingeben.
    Jetzt bräuchte ich eine Schleife, die mir jedes Datum abfragt.

    Wie mache ich das?

    MfG

  4. #4
    Registrierter Benutzer
    Registriert seit
    13.02.2006
    Beiträge
    47
    Warum nimst du nicht das Datum aus der Datei?
    z.B.: Erstes Datum aus Datei in tmpfile schreiben.
    Ist nächstes Datum ungleich des letzten Datums, dann an >>tmpfile
    Zum Schluss Datum nacheinander zum sortieren aus tmpfile lesen.

  5. #5
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.859
    Moin moin,
    funzt das nicht auch so?
    Code:
    id11=`grep -c "11: $1" sortiert`
    grep kann doch selbst bis drei zaehlen

    MfG,
    Rainer
    There's nothing a good whack with a hammer won't fix!

  6. #6
    Registrierter Benutzer Avatar von dilindam
    Registriert seit
    21.01.2004
    Beiträge
    15
    Hallo,

    @rais, @musketaquid ich versteh euch beide nicht.

    Vielleicht ihr mich ja auch nicht.
    Also, ob die Datei nun sortiert ist oder nicht, spielt, glaube ich, gar keine Rolle.
    Da sie jeden Tag neu erzeugt wird ist es mit untenstehenden Befehl ein leichtes die IDs des Tages zu zählen.

    Das Problem ist nur das alle IDs der letzten Jahre nun noch gezählt werden müssen. Und da komme ich nicht weiter.

    DATUM=`date +%Y-%m-%d`
    id11=`cat sortiert | grep "11: $DATUM"|wc -l`

    Naja ich bin weiter am tüfteln und überlegen.
    Vielleicht hat ja noch jemand ne Lösung.

    MfG

  7. #7
    Registrierter Benutzer
    Registriert seit
    24.02.2006
    Beiträge
    8
    Brauchst du nur die Anzahl der Zeilen die mit '11' anfangen, oder jede ID (1..??) und das dazugehoerige Datum dazu, oder was denn genau?

  8. #8
    Registrierter Benutzer Avatar von dilindam
    Registriert seit
    21.01.2004
    Beiträge
    15
    Zitat Zitat von nic
    Brauchst du nur die Anzahl der Zeilen die mit '11' anfangen, oder jede ID (1..??) und das dazugehoerige Datum dazu, oder was denn genau?
    Hallo,

    Kennst Du dich etwas mit rrdtool aus?
    Damit erstelle ich Grafiken über alles mögliche. z.B. Netzwerktraffic
    Ich soll eine Grafik erstellen, die mir anzeigt das am 18.07.2002 ein
    Server hard-rebooted wurde. Das besagt nämlich die ID 11. Die ID 12
    besagt das es ein Soft-Reboot war. Am 31.08.2002 waren es dann wieder 1 Reboot. Irgendwann kommt aber auch der Fall vor das mehrere reboots an einem Tag stattfanden. Das ist in meinem Beispiel oben nicht zu sehen.

    Und die Daten muss ich zählen und in eine RoundRobinDatabase einpflegen
    um danach eine Grafik daraus zu erstellen. Also Wieviele hard-reboots waren am Tage x, wieviele am Tage y, usw.

    Heute Nacht läuft wieder das Skript welches schaut wieviel hard-reboots usw dann heute waren und fügt mir das in die RRD ein.

    Nur ich soll die alten Daten aufarbeiten. Die hätten mit der Aufzeichnung 2002 beginnen sollen. Oder?

    MfG

  9. #9
    Registrierter Benutzer
    Registriert seit
    13.02.2006
    Beiträge
    47
    Wenn ich dich richtig verstanden habe, brauchst du sowas wie 'ne Kalenderfunktion.
    Für die shell ist das aber schwierig, weil ich zu cal oder ncal keine Option gefunden habe, die dir helfen könnte.
    Aber in Perl könnte man vielleicht was machen, schau mal hier rein:
    http://www.linux-magazin.de/Artikel/...Perl/perl.html

  10. #10
    Registrierter Benutzer
    Registriert seit
    24.02.2006
    Beiträge
    8
    Also ich persoenlich wuerde da jetzt sofort zu Perl greifen, falls das fuer dich ne akzeptable Loesung ist hilft dir vielleicht sowas:
    Code:
    foreach(@foo)
    {
        chomp;
        /(\d{2}):\s+([\d-]{10})\s+/;
        
        # jetzt enthaelt $1 die ID und $2 das Datum
    }
    Je nachdem wie du das dann mit RRD loesen willst (da hab ich leider jetzt keine Erfahrung damit) kannst du $1 und $2 dann beispielsweise in ein Array schreiben, per sort() sortieren oder was auch immer du sonst brauchst.

    hope that helps...
    Nic

  11. #11
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.859
    Moin moin,
    Zitat Zitat von dilindam
    Hallo,

    @rais, @musketaquid ich versteh euch beide nicht.

    Vielleicht ihr mich ja auch nicht.
    ich meinte, wenn Du nur zählen willst, dann kann das grep auch allein erledigen (sofern nicht der gesuchte String innerhalb einer Zeile öfter vorkommen kann - falls doch, hat sich das eh erledigt)
    Also bezogen auf
    Zitat Zitat von dilindam
    DATUM=`date +%Y-%m-%d`
    id11=`cat sortiert | grep "11: $DATUM"|wc -l`
    dann entsprechend
    Code:
    DATUM=`date +%Y-%m-%d`
    id11=`grep -c "11: $DATUM" sortiert-oder-auch-nicht`
    Wozu drei Programme aufrufen, wenn eines wohlmöglich reicht?
    Die Frage ist halt, ob's denn reicht

    Apropos... wieso date? Du musst doch ältere Daten abfragen, also so etwas wie
    Code:
    for Y in 2002 2003 2004 2005; do
        for M in 1 2 3 4 5 6 7 8 9 10 11 12; do
            for D in `cal $M $Y | egrep -v [aeiouy]`; do
                id11=`grep -c "11: $Y-$M-$D" sortiert-oder-auch-nicht`
                #was-auch-immer-Du-damit-nu-vorhast
            done
        done
    done
    oder was schwebt Dir so vor?
    [ed]Du mußt wohl erst $D und $M auf zwei Stellen bringen[/ed]
    MfG,
    Geändert von rais (04-03-2006 um 03:04 Uhr)
    Rainer
    There's nothing a good whack with a hammer won't fix!

  12. #12
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.859
    Nochmal leicht geändert, damit $D und $M auch zweistellig laufen:
    Code:
    for Y in 2002 2003 2004 2005; do
        for M in 01 02 03 04 05 06 07 08 09 10 11 12; do
            for D in `cal $M $Y | egrep -v [aeiouy]`; do
                test $D -lt 10 && D=0$D
                id11=`grep -c "11: $Y-$M-$D" sortiert-oder-auch-nicht`
                #was-auch-immer-Du-damit-nu-vorhast
            done
        done
    done
    MfG,
    Rainer
    There's nothing a good whack with a hammer won't fix!

  13. #13
    Registrierter Benutzer
    Registriert seit
    13.02.2006
    Beiträge
    47
    @ rais
    Zitat von mir:
    Für die shell ist das aber schwierig, weil ich zu cal oder ncal keine Option gefunden habe, die dir helfen könnte.
    Code von rais:
    Code:
    cal $M $Y | egrep -v [aeiouy]
    Da hab ich mich wohl von der mehrzeiligen Ausgabe von cal irritieren lassen. Ich dachte, die ist nur was für's Auge und wäre für 'ne schleife nicht zu gebrauchen. Aber wie sagt man so schön; Geht nicht, gibts nicht!

  14. #14
    Registrierter Benutzer
    Registriert seit
    01.07.2004
    Beiträge
    46
    Sehr geile Umsetzung rais! Wobei man mit seq die Geschichte noch optimieren kann:
    Code:
    #!/bin/sh
    for Y in $(seq 2002 2005); do
        for M in $(seq -w 01 12); do
            for D in `cal $M $Y | egrep -v [aeiouy]`; do
                test $D -lt 10 && D=0$D
                echo $Y-$M-$D
                # id11=`grep -c "11: $Y-$M-$D" sortiert-oder-auch-nicht`
                #was-auch-immer-Du-damit-nu-vorhast
            done
        done
    done

  15. #15
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.859
    *g*

    Der Tip mit seq ist aber auch nicht schlecht
    Vielleicht noch erwähnenswert, daß hier statt egrep auch der normale grep genommen werden kann - ist ja doch eine einfache 'regular expression' geworden... oder vielleicht ein "regulärer Regulärer Ausdruck" ?
    Tut ja nicht Not, ein Shellscript namens 'egrep' zu starten, das dann wiederum 'grep -E' aufruft - zumal's in ner Schleife steht...

    MfG,
    Rainer
    There's nothing a good whack with a hammer won't fix!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •