geburtstags reminder

M

maik kaurik

Grünschnabel
hi, ich möchte auf meinem raspberry pi nen b day reminder laufen lassen.

ein cron job soll täglich prüfen ob in datenbank.txt das heutige datum vorkommt. wenn ja email auf mein handy. (zur grundfunktionalität)


konkret:
von meinem handy kann ich eine email an den PI senden mit
Code:
add
hans wurst 10.06.1987
jetzt soll geprüft werden, ob "hans wurst 10.06.1987" schon in datenbank.txt vorhanden ist.
wenn nicht, soll es reingeschrieben werden.

leider geht das script nicht so wirklich. es hängt an dem 2. grep.
hier mal der code
Code:
#!/bin/sh
SUCHE=$(grep -i -v "add" email-add.txt #das add ist das schlagwort für das hinzufügen. alles ausser add wird in variable geschrieben
if grep -Fxq $SUCHE datenbank.txt
then
   echo "$SUCHE >> datenbank.txt"
fi
#email-add.txt ist ne dummy mail zum simulieren.

hat jemand nen tip für mich?

grüße
maik
 
Moin,

aus der Manpage zu grep:
Code:
 -q, --quiet, --silent
              Unterdrückt die normalen Ausgaben. Die Suche endet sofort  nach  dem  ersten  Treffer  und  gibt  auch  beim
              Auftreten  von  Fehlern  den  Status  Null  zurück.
Rückgabewert 0 = True -> also wird die Schleife immer ausgeführt.

Du suchst brauchst eher nen was nach dem Muster

Code:
if [ `grep -[COLOR="#FF0000"]c[/COLOR] $SUCHE` -eq 0]; then
...

mfg
HeadCrash
 
danke für deinen beitrag.
es lag an den fehlenden " beim 2. grep

Code:
#!/bin/sh
SUCHE=$(grep -i -v "add" email-add.txt #das add ist das schlagwort für das hinzufügen. alles ausser add wird in variable geschrieben
if grep -Fxq "$SUCHE" "datenbank.txt"
then
   echo "$SUCHE >> datenbank.txt"
fi

als nächstes möchte ich, dass ich mit
Code:
remove
klaus 10.06.1988
den eintrag aus der datenbank entferne.

Code:
#!/bin/sh
SUCHE=$(grep -i -v "remove" email-remove.txt 
if grep -Fxq "$SUCHE" "datenbank.txt"
then
   befehl zum löschen des eintrages in der datenbank.txt
fi

ich habe jetzt nen paar varianten mit
Code:
greb -v  "$SUCHE" datenbank.txt >> datenbank.txt
probiert, das funktioniert aber nicht so wirklich. (inputfile=outputfile error)

gibt es ne elegante lösung?
 
Zuletzt bearbeitet:
So kann es gehen:
Code:
grep -v  "$SUCHE" datenbank.txt > zwischendatei.txt
mv zwischendatei.txt datenbank.txt
 
super, das klappt gut.

nächster step ist die datenbank chronologisch auszugeben

gegeben:

datenbank ist so aufgebaut:
Code:
 dominik 10.02.1988
franz 22.02.1987
klaus 11.03.1899
hanz 10.01.1855

Aufgabe:

ausgabe sollte mit dem nächsten datum beginnen
also heutiges datum (11.06.2015) wobei das jahr keine beachtung findet
beispiel:
Code:
hanz 10.01.1855
dominik 10.02.1988
franz 22.02.1987
klaus 11.03.1899


ansatz:
Code:
#!/bin/sh
DATUM=$(date +"%d.%m") #tag, monat wird in now gespeichert

DATUM soll nun als referenz dienen. bevor ich mir jetzt den kopf zerbreche wie ich die unterschiedlichen tage in monaten vernünftig zum laufen bekomme, wollte ich erstmal fragen, ob es nicht schon eine funktion für sowas gibt.
 
bevor ich mir jetzt den kopf zerbreche wie ich die unterschiedlichen tage in monaten vernünftig zum laufen bekomme, wollte ich erstmal fragen, ob es nicht schon eine funktion für sowas gibt.
Vielleicht findest du irgendwo dafür ein Code-Snipplet, ja. Aber warum willst du das Problem unbedingt über Textdateien und Shellskripte lösen?
Ich würde mir hierfür eine MySQL Datenbank anegen und mir ein kleines ORM schreiben, was ich dann in meinem Programm benutzen kann.
Ich bin da ein großer fan von Python 3 + peewee.
Natürlich ginge auch jede andere höhere Programmiersprache. Aber ein Shellskript dafür? Das wäre mir zu aufwändig und fehleranfällig.

MfG

Schard
 
Hmm, MySQL dürfte dafür en bissl übertrieben sein :D
Würde hierfür in Richtung sqlite schielen.

Das ganze per Shellskirpt *schauder* *als Aufgabe für die nächsten Azubis notier*
Am einfachsten das Datum im Format 2014-01-24 in der ersten Spalte speichern, dann bekommt man das via "sort" :)

mfg
HeadCrash
 
muss ja echt etwas grinsen, als ich deinen beitrag gelsen hab^^
natürlich ist es ziemlicher blödsinn...

liegt alles an ner wette...
ich bin ein mensch der geburtstage nicht wichtig findet. ich selber freue mich, wenn mir keiner gratuliert und ich mag es auch nicht irgendwelche leute anzurufen um denen zu gratulieren.
zu nem teil liegt es auch dran, dass ich mir keine geburtstage merken kann.

ich hab es des öfteren probiert mit kalendern, analog und digital.
analog ist es mir zu nervig, das teil muss man immer rumschleppen falls mal jemand plötzlich geburtstag hat...
digital war immer das problem, dass ich öfters mal geräte wechsel und die kalender untereinander nicht kompatibel waren. grade bei alten handys.

einem freund ging mein ständiges geburtstagsvergessen irgendwann so sehr aufn sack, dass er mit mir problemlösestrategien diskutierte xD

wir kamen auf nen raspberry pi, der immer läuft und die daten per mail sendet. der ist voll kompatibel zu allen endgeräten, die emails empfangen können.
er gab mir den PI und meinte binnen einer woche muss ich das zum laufen bekommen, dann darf ich den pi behalten und mein nächster geburtstag geht auf ihn :D

naja ich fange grade, was linux und programieren angeht bei null an. direkt mit sql einsteigen etc. würde evtl. den rahmen von einer woche sprengen.
ich das muss doch so gehen.!

nunja gedankenmäßig bin ich jetzt so weit, dass ich mit
Code:
1=$(date --date='1day' +"%d.%m" )
mir 366 variablen erstelle
und mit ner mega if schleife a la:
Code:
if grep -Fxq "$DATUM" "datenbank.txt"
        then echo grep "$DATUM" "datenbank.txt"
else
        if grep -Fxq "$1" "datenbank.txt"
        then echo "$1" >> sortiert.txt
        fi
        if grep -Fxq "$2" .... und so weiter bis die 366 voll sind
fi

warscheinlich DER uneleganteste weg, ist auch bisher nur brainstorming.... für vorschläge bin ich natürlich offen :)

schönen abend noch
 
Dann sollte es doch gehen:
Code:
HEUTE=$(date +"%d.%m.")
grep " $HEUTE" datenbank.txt | mail an@mich .... usw.
 
Code:
awk '{split($NF,a,".");print a[2]"."a[1],$0}' "Daten.txt" | sort -n | awk -v "t=$(date +%m.%d)" '{if($1>=t){$1="";print substr($0,2)}}'
"Daten.txt" muss natürlich angepasst werden.
 
Das Prinzip wurde schon in Post #7 gepostet: Man erzeuge ein sortierbares Feld in jede Zeile, hier reicht Monat und Tag. Das tut der 1. awk-Befehl.
Sort sortiert das Ganze dann und am Schluss räumt awk auf, bzw. entscheidet, was ausgegeben werden soll (der Code gibt keine Geburtstage aus, die dieses Jahr schon vergangen sind).
 
Zurück
Oben