PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : grep-Probleme



01-12-2000, 08:35
Hallo,
in einem Shell-script werte ich das Tagesdatum und Monatsdatum aus um über diese aus einer Liste bestimmte Einträge herauszufiltern:

''''''''''''''''''''Script
#!/bin/ksh
#
# Glueckwuensche zum Geburtstag
#

# exec >./ausgabe.txt 2>&1


# Tagesdatum ermitteln und in $tag eintragen
tag=`date "+%d"`
#tag=11
# Monatsdatum ermitteln und in $monat eintragen
monat=`date "+%m"`
# Jahresdatum ermitteln und in $jahr eintragen
jahr=`date "+%Y"`

# alle aktuellen Geburtskinder in eigene Datei
# speichern
cat /root/batches/geburtstag/liste | grep "$tag $monat" | cut -f 3,4 > /root/batches/geburtstag/heuteliste

liste=`less /root/batches/geburtstag/heuteliste`
[ "$liste" != "" ] && set $liste
# echo $liste

abbruch=$(cat /root/batches/geburtstag/heuteliste | cut -f 1)

'''''''''''''''

in der Datei "liste" befinden sich Einträge wie:
01 12 user1.user1@domaene.de
1 12 user1.user1@domaene.de

bei dem "grep"-Befehl ist ein "tab" zwischen $tag und $monat.

Folgendes passiert: solange die daten größer "10" sind läuft das Script. Aber bei Zahlen kleiner 10, als wie heute am 1.12. bekomme ich nichts heraus. Date liefert alle Angaben 2 stellig an, weshalb ich einen heutigen Eintrag auf "01 12" geändert habe, aber auch dann passiert nichts.

Wenn ich $tag fest auf z.B. 11 stelle läuft mein Script sofort wieder.

Kann mir jemand das erklären?

Danke,
Werner

thommy
01-12-2000, 10:48
Damit die führende Null von date nicht an die Variable zugewiesen wird, kannst Du diese mit "declare -i" als Integer vereinbaren:

<pre>
declare -i tag
tag=`date "+%d"`
echo $tag
1
</pre>

Damit deckt sich erst eimal der Variableninhalt mit dem Eintrag Deiner Datei.

Anstelle "grep" würde ich "egrep" empfehlen, da Du dort Muster wie : egrep "$tag( |\t)+$monat" verwenden kannst (zu lesen als "mindestens ein Leerzeichen oder Tabulator")

Thomas

thommy
01-12-2000, 13:06
'tschulding, sehe gerade, dass Du einer der wenigen Ksh-Benutzer bist... declare ist bash-spezifisch... So weit ich weiß, gibts in ksh nichts äquivalentes...

Das mit der Null ist mir auch nicht klar, aber bez. egrep habe ich mal awk und grep durcheinander geworfen... grep kennt "\t" als Tabulator-Ersatzdarstellung nicht.

Deswegen sollte die egrep-Zeile richtig heißen:
<pre>
egrep "$tag[[:space:]]+$monat"
</pre>

Damit sollte es aber schon laufen...

Thomas

02-12-2000, 00:13
Hi Thommy,
bist Du sicher, daß mit in Shell-Scripts "declare" verwenden kann.
Ich bekomme einen Fehler, der darauf hindeutet, daß es den Befehl nicht gibt.
Hast Du eine Ahnung auf welche Art von Fehler ich hier laufe, warum es ohne "0" geht, aber nicht mit mit?
MfG,
Werner

mightymike99
03-12-2000, 04:55
Hi wer_ner,

Das mit dem einstelligen Tagesdatum bringt auf jeden Fall Fehler
grep "1 12"
-> 1.12
-> 11.12. ???
-> 21.12. ???
Hat ich vor kurzem mit IPs´
Gib dem grep mit das er fest vom Zeilenanfang suchen kann
grep "^$tag $monat"

mfg Tobias

04-12-2000, 08:44
Hi,
das Äquivalent zu "declare" ist "typeset", daß gibts glaube ich auch in der bash, zumindest nach meinem Buch.
Ich werds mal ausprobieren.
MfG,
Werner

04-12-2000, 10:57
Hi,
ich habs gelöst, so läuft es :-) :

#!/bin/ksh
#
# Glueckwuensche zum Geburtstag
#

# exec >/batches/geburtstag/ausgabe.txt 2>&1

# Tagesdatum ermitteln und in $tag eintragen
typeset -i tag
tag=`date "+%d"`
# Monatsdatum ermitteln und in $monat eintragen
typeset -i monat
monat=`date "+%m"`

# Jahresdatum ermitteln und in $jahr eintragen
jahr=`date "+%Y"`

# alle aktuellen Geburtskinder in eigene Datei
# speichern
# aufkommentierter Befehl macht Fehler mit einstelligen Datumangaben !!!!
#cat /batches/geburtstag/liste | grep "$tag $monat" | cut -f 3,4 > /batches/geburtstag/heuteliste
/bin/egrep "^$tag[[:space:]]+$monat[[:space:]]" liste | cut -f 3,4 > /batches/geburtstag/heuteliste


liste=`less /batches/geburtstag/heuteliste`
set $liste

abbruch=$(cat /batches/geburtstag/heuteliste | cut -f 1)
# echo $abbruch

for i in $abbruch
do
done

***************

bei dem egrep-Befehl fehlte noch ein "tab" am Ende, da sonst der Januar auch den Oktober, November oder Dezember mitgenommen hätte.
Vielen Dank für Eure Hilfe,
wenn jemand das ganze Script braucht, Mail.
MfG,
Werner