Anzeige:
Ergebnis 1 bis 7 von 7

Thema: grep-Probleme

  1. #1
    Gast

    Post grep-Probleme

    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

  2. #2
    Registrierter Benutzer
    Registriert seit
    19.10.1999
    Ort
    Dresden
    Beiträge
    255

    Post

    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

  3. #3
    Registrierter Benutzer
    Registriert seit
    19.10.1999
    Ort
    Dresden
    Beiträge
    255

    Post

    '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

  4. #4
    Gast

    Post

    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

  5. #5
    Senior Mitglied
    Registriert seit
    23.08.1999
    Beiträge
    132

    Post

    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

  6. #6
    Gast

    Post

    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

  7. #7
    Gast

    Post

    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


Lesezeichen

Berechtigungen

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