PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shell: Fragen zu date und rrdtool



dilindam
02-03-2006, 12:26
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

ninguno
02-03-2006, 12:47
du musst bei deinem grep doppelte hochkommas verwenden
id11=`cat sortiert | grep "11: $1"|wc -l`

dilindam
02-03-2006, 13:12
du musst bei deinem grep doppelte hochkommas verwenden
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

musketaquid
02-03-2006, 16:03
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.

rais
03-03-2006, 10:45
Moin moin,
funzt das nicht auch so?

id11=`grep -c "11: $1" sortiert`
grep kann doch selbst bis drei zaehlen:D

MfG,

dilindam
03-03-2006, 11:56
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

nic
03-03-2006, 12:09
Brauchst du nur die Anzahl der Zeilen die mit '11' anfangen, oder jede ID (1..??) und das dazugehoerige Datum dazu, oder was denn genau?

dilindam
03-03-2006, 13:50
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

musketaquid
03-03-2006, 15:59
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/ausgabe/2001/09/Perl/perl.html

nic
03-03-2006, 16:06
Also ich persoenlich wuerde da jetzt sofort zu Perl greifen, falls das fuer dich ne akzeptable Loesung ist hilft dir vielleicht sowas:


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

rais
04-03-2006, 02:01
Moin moin,

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


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

dann entsprechend
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


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?
Du mußt wohl erst $D und $M auf zwei Stellen bringen
MfG,

rais
04-03-2006, 12:05
Nochmal leicht geändert, damit $D und $M auch zweistellig laufen:


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,

musketaquid
04-03-2006, 17:26
@ 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:

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! :o

bash_azubi
07-03-2006, 07:17
Sehr geile Umsetzung rais! Wobei man mit seq die Geschichte noch optimieren kann:

#!/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

rais
10-03-2006, 00:55
*g*

Der Tip mit seq ist aber auch nicht schlecht :D
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,