Anzeige:
Seite 2 von 2 ErsteErste 12
Ergebnis 16 bis 25 von 25

Thema: date grep Sprachproblem

  1. #16
    Registrierter Benutzer
    Registriert seit
    19.06.2000
    Beiträge
    32
    Hi

    Vielen Dank für Dein schreiben. Wir hatten ja weiter oben festgestellt das das setzen der LC_TIME bei mir, warum auch immer, keinerlei Auswirkungen hat.
    Das ganze dient dazu mir einige Logfiles aus zu lesen und mir das ausgelesene als Mail zu schicken. Cron soll das ganze automatisch anwerfen. Nun muß man sagen das ich von Shellscripten nicht viel Ahnung habe.


    logwatch.daily für cron
    Code:
    #! /bin/sh
    rootmail=root@mydomain
    
    if [ -x /usr/local/bin/logwatch ]
            then
                    /usr/local/bin/logwatch | mail -s "taegliche Logwatch Meldung" $rootmail
            else
                    echo "Warnung es ist kein logwatch Script unter /usr/local/bin zu finden" -s "taegliche Logwatch Meldung" $rootmail
    fi
    Das eigentliche Skript was ausgeführt werden soll
    Code:
    #! /bin/bash
    ## Auszüge aus verschiedenen Logfiles per Mail versenden
    datum=`date`
    rechner=`hostname`
    
    
    echo
    echo
    echo "Logfilebericht            $datum"
    echo "       Rechner:    $rechner"
    echo
    echo
    echo "===== Begin Festplattenbelegung =========="
    echo
    echo "`df -h`"
    echo
    echo "===== Ende Festplattenbelegung =========="
    echo
    echo
    echo
    echo
    echo "===== Begin ClamAV Update Virendatenbank ="
    echo
    echo "`cat /var/log/clamav/freshclam.log | grep "\`date -R | awk '{printf("%.3s %s  %d\n",$1,$3,$2)}'\`"`"
    echo
    echo "===== Ende ClamAV Update Virendatenbank =========="
    #
    ####### Beispiele die funktionieren ################
    ### grep "`date -R | awk '{printf("%.3s %s  %d\n",$1,$3,$2)}'`" /var/log/clamav/freshclam.log
    ### echo "`cat /var/log/clamav/freshclam.log | grep "\`date -R | awk '{printf("%.3s %s  %d\n",$1,$3,$2)}'\`"`"
    ### cat /var/log/clamav/freshclam.log | grep "`date -R | awk '{printf("%.3s %s  %d\n",$1,$3,$2)}'`"
    ### date -R | awk '{printf("%.3s %s  %d\n",$1,$3,$2)}'
    #
    echo
    echo
    echo
    echo
    echo "===== Begin Fehlermeldung ClamAV vom aktuellen Datums in /var/log/clamav/clamd.log =========="
    echo
    echo "`cat /var/log/clamav/clamd.log | grep -i -e error -e warn -e fail`"
    #
    ####### Beispiele die funktionieren ################
    ### echo "`cat /var/log/clamav/clamd.log | grep "\`date -R | awk '{printf("%.3s %s  %d\n",$1,$3,$2)}'\`"`"
    #
    echo
    echo "===== Ende ClamAV Logfile Auszug es aktuellen Datums =========="
    echo
    echo
    echo
    echo
    echo "===== Begin Fehlermeldungen vom aktuellen Datum in /var/log/everything/ =========="
    echo
    echo "`cat /var/log/everything/log-\`date -I\`* | grep -i -e fail -e warn -e error`"
    echo "`cat /var/log/everything/current | grep -i -e fail -e warn -e error`"
    echo
    echo "===== Ende Fehlermeldungen vom aktuellen Datum in /var/log/everything/ =========="
    echo
    echo
    echo
    echo
    echo "===== Begin Fehlermeldungen vom aktuellen Datum in /var/log/mail/ =========="
    echo
    echo "`cat /var/log/mail/log-\`date -I\`* | grep -i -e fail -e warn -e error`"
    echo "`cat /var/log/mail/current | grep -i -e fail -e warn -e error`"
    echo
    echo "===== Ende Fehlermeldungen vom aktuellen Datum in /var/log/mail/ =========="
    Leider hat sich im nachhinein noch ergeben das ich das datum vom Vortag für das freshclam logfile brauche. Also wenn Du da eine colle Idee hast wäre ich Dir sehr dankbar.



    Gruß Leon
    Wenn Microsoft die Lösung meines Problems ist, dann möchte ich gerne mein Problem wieder!

  2. #17
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von leon Beitrag anzeigen
    Vielen Dank für Dein schreiben. Wir hatten ja weiter oben festgestellt das das setzen der LC_TIME bei mir, warum auch immer, keinerlei Auswirkungen hat.
    Probier mal die von mir gepostete Schreibweise. Es gibt einen wesentlichen Unterschied zwischen den verschiedenen Aufrufmethoden:
    Code:
    jan@jack:~> bash
    jan@jack:~> echo $LC_TIME
    
    jan@jack:~> LC_TIME=en_EN.utf8 && date +"%a %b %e"
    Di Mär 11
    jan@jack:~> echo $LC_TIME
    en_EN.utf8
    jan@jack:~> date +"%a %b %e"
    Di Mär 11
    jan@jack:~> LC_TIME=en_EN.utf8 date +"%a %b %e"
    Tue Mar 11
    jan@jack:~> exit
    jan@jack:~> bash
    jan@jack:~> echo $LC_TIME
    
    jan@jack:~> LC_TIME=en_EN.utf8 date +"%a %b %e"
    Tue Mar 11
    jan@jack:~> LC_TIME=en_EN.utf8 && date +"%a %b %e"
    Di Mär 11
    jan@jack:~> export LC_TIME=en_EN.utf8 && date +"%a %b %e"
    Tue Mar 11
    Der wesentliche Unterschied liegt darin, dass die vorher geposteten Varianten die Variable nicht exportieren. Damit stehen sie in geforkten Prozessen nicht zur Verfügung. Die von mir genutzte Variante führt aber das date-Kommando zusammen mit der Zuweisung von LC_TIME aus, nicht als getrennte Befehle. Die letzte Variante exportiert und damit steht das LC_TIME dem date auch zur Verfügung.

    Zu Deinem Script: Nein, Du brauchst den echo wirklich nicht.

    Warum nicht einfach:
    Code:
    #! /bin/bash
    ## Auszüge aus verschiedenen Logfiles per Mail versenden
    datum=`date`
    rechner=`hostname`
    
    
    echo
    echo
    echo "Logfilebericht            $datum"
    echo "       Rechner:    $rechner"
    echo
    echo
    echo "===== Begin Festplattenbelegung =========="
    echo
    df -h
    echo
    echo "===== Ende Festplattenbelegung =========="
    echo
    echo
    echo
    echo
    echo "===== Begin ClamAV Update Virendatenbank ="
    echo
    LC_TIME=en_EN.utf8 grep "`date +\"%a %b %e\"`" /var/log/clamav/freshclam.log
    echo
    echo "===== Ende ClamAV Update Virendatenbank =========="
    ...
    ???

    Wobei ich folgende Schreibweise noch übersichtlicher finde (ein Argument für echo kann sich durchaus über mehrere Zeilen erstrecken):
    Code:
    #! /bin/bash
    ## Auszüge aus verschiedenen Logfiles per Mail versenden
    datum=`date`
    rechner=`hostname`
     
    echo "
     
    
    Logfilebericht            $datum
           Rechner:    $rechner
    
    
    ===== Begin Festplattenbelegung ==========
    
    "
    df -h
    echo "
     
    ===== Ende Festplattenbelegung ==========
    
    
    
    
    ===== Begin ClamAV Update Virendatenbank =
    
    "
    LC_TIME=en_EN.utf8 grep "`date +\"%a %b %e\"`" /var/log/clamav/freshclam.log
    echo "
     
    ===== Ende ClamAV Update Virendatenbank ==========
    
    "
     ...
    Datum von gestern geht z. B. so:
    Code:
    jan@jack:~> LC_TIME=en_EN.utf8 date -d yesterday +"%a %b %e"
    Mon Mar 10
    Jan

    EDIT: Ich bin auf den Rest Deines Scripts nicht eingegangen, aber auch hier kannst Du den echo an allen Stellen rausnehmen (und kriegst dadurch ein IMHO deutlich übersichtlicheres und ressourcenschonenderes Script), wo Du Befehlsausgaben ausgeben willst. Die Konstruktion echo "`irgend_ein_befehl`" macht nämlich nur eins: Sie fängt die Standardausgabe von irgend_ein_befehl, um sie dann auf der Standardausgabe auszugeben. Das ist doppelt gemoppelt. "`irgend_ein_befehl`" macht nur dann Sinn, wenn Du die Ausgabe des Befehls z. B. an eine Variable zuweisen willst, um sie danach weiterzuverwenden oder sie wie oben als Argument für ein anderes Kommando verwenden willst.
    Geändert von jan61 (11-03-2008 um 19:15 Uhr) Grund: Noch was zum date vergessen

  3. #18
    Registrierter Benutzer
    Registriert seit
    19.06.2000
    Beiträge
    32
    Hi

    Danke für Deine Hilfe.

    Also folgendes habe ich gemacht

    Code:
    jan@jack:~> bash
    jan@jack:~> echo $LC_TIME
    
    jan@jack:~> LC_TIME=en_EN.utf8 && date +"%a %b %e"
    Di Mär 11
    jan@jack:~> echo $LC_TIME
    en_EN.utf8
    jan@jack:~> date +"%a %b %e"
    Di Mär 11
    jan@jack:~> LC_TIME=en_EN.utf8 date +"%a %b %e"
    Tue Mar 11
    Und hier hackt es schon. Ich bekomme nicht wie Du die englische sondern die deutsche Ausgabe.
    Code:
    server tmp # LC_TIME=en_EN.utf8 date -d yesterday +"%a %b %e"
    Mo Mär 10
    server tmp # bash
    server tmp # echo $LC_TIME
    
    server tmp # LC_TIME=en_EN.utf8 && date +"%a %b %e"
    Di Mär 11
    server tmp # echo $LC_TIME
    en_EN.utf8
    server tmp # date +"%a %b %e"
    Di Mär 11
    server tmp # LC_TIME=en_EN.utf8 date +"%a %b %e"
    Di Mär 11
    server tmp #
    Und hier der Rest des Grauens :-)
    Code:
    server tmp # exit
    exit
    server tmp # bash
    server tmp # echo $LC_TIME
    
    server tmp # LC_TIME=en_EN.utf8 date +"%a %b %e"
    Di Mär 11
    server tmp # LC_TIME=en_EN.utf8 && date +"%a %b %e"
    Di Mär 11
    server tmp # export LC_TIME=en_EN.utf8 && date +"%a %b %e"
    Di Mär 11
    server tmp #
    Aber egal. Ich schreibe jetzt erstmal den Rest sauber und dann schauen wir mal in Ruhe.

    Könntest Du mir bitte diese Zeile ohne echo geben
    Code:
    echo "`grep \"\`date -R | awk '{printf(\\\"%.3s %s %2d\n\\\",$1,$3,$2)}'\`\" /var/log/clamav/freshclam.log`"

    Vielen Dank
    Leon
    Wenn Microsoft die Lösung meines Problems ist, dann möchte ich gerne mein Problem wieder!

  4. #19
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von leon Beitrag anzeigen
    ...
    Code:
    server tmp # LC_TIME=en_EN.utf8 date -d yesterday +"%a %b %e"
    Mo Mär 10
    server tmp # bash
    server tmp # echo $LC_TIME
    
    ...
    server tmp # LC_TIME=en_EN.utf8 date +"%a %b %e"
    Di Mär 11
    server tmp #
    Aber egal. Ich schreibe jetzt erstmal den Rest sauber und dann schauen wir mal in Ruhe.
    Ha - ist mir gar nicht egal ;-) Und ich glaube, ich weiss jetzt auch, wo der Hase im Pfeffer begraben liegt! Ich habe mir Deine vorigen Postings nochmal durchgeguckt und die Liste Deiner Umgebungsvariablen entdeckt. Auf Deinem System sind ja alle LC_*-Variablen gesetzt, und da ist eine ganz fiese dabei: LC_ALL übersteuert alle anderen LC_*-Settings. Dann habe ich das bei mir nachgezogen (da ist per Default nur LANG gesetzt) und siehe da:
    Code:
    jan@jack:~> export LC_ALL=de_DE.utf8
    jan@jack:~> LC_TIME=en_EN.utf8 date -d yesterday +"%a %b %e"
    Mo Mär 10
    jan@jack:~> LC_ALL=en_EN.utf8 date -d yesterday +"%a %b %e"
    Mon Mar 10
    Zitat Zitat von leon Beitrag anzeigen
    Könntest Du mir bitte diese Zeile ohne echo geben
    Code:
    echo "`grep \"\`date -R | awk '{printf(\\\"%.3s %s %2d\n\\\",$1,$3,$2)}'\`\" /var/log/clamav/freshclam.log`"
    Versuchs erstmal mit der obigen Variante, ansonsten:
    Code:
     grep "`date -R | awk '{printf(\"%.3s %s %2d\n\",$1,$3,$2)}'`" /var/log/clamav/freshclam.log
    Jan

  5. #20
    Registrierter Benutzer
    Registriert seit
    19.06.2000
    Beiträge
    32
    Hi Jan61

    Ich denke das es so wie Du es geschrieben hast funktionieren wird. Leider kann ich wegen Zeitmangel erst am WE wieder testen.

    Kann ich das mit der LC_LANG denn dann auch in mein Skript einbauen?
    Ich dachte mir das so


    Code:
    #!/bin/bash
    
    /bin/bash
    LC_ALL=en_EN.utf8
    
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    exit
    Ich will nicht das das setzen der LC meine Umgebungsvariablen vom Server komplett verhunzen.
    Wenn Microsoft die Lösung meines Problems ist, dann möchte ich gerne mein Problem wieder!

  6. #21
    Registrierter Benutzer
    Registriert seit
    19.06.2000
    Beiträge
    32
    Hi

    Ok es geht soweit alles. In meinem Skript muß ich nur den bash Befehl weg lassen.

    Aber jetzt habe ich hoffentlich nur noch eine einzige Frage :-)

    Wie mache ich das richtig

    Code:
    cat /var/log/everything/log-`date -d yesterday -I`* | grep date -d yesterday +"%a %b %e"` -i -e fail -e warn -e error


    Vielen Dank für Deine Mühe
    Wenn Microsoft die Lösung meines Problems ist, dann möchte ich gerne mein Problem wieder!

  7. #22
    Registrierter Benutzer
    Registriert seit
    19.06.2000
    Beiträge
    32
    So habe es jetzt hin bekommen. Habe es etwas anders gemacht wie gedacht, aber es geht super


    Code:
    #! /bin/bash
    ## Auszüge aus verschiedenen Logfiles per Mail versenden
    
    # Umgebungsvariable setzen
    LC_ALL=en_EN.utf8
    datum=`date`
    rechner=`hostname`
    
    echo "
    
          Logfilebericht            $datum
                 Rechner:            $rechner
    
    
    ========== Begin Festplattenbelegung ==========
    "
    df -h
    echo "
    ========== Ende Festplattenbelegung ==========
    
    
    
    
    ========== Begin ClamAV Update Virendatenbank ==========
    "
    grep "`date -d yesterday +"%a %b %e"`" /var/log/clamav/freshclam.log
    echo "
    ========== Ende ClamAV Update Virendatenbank ==========
    
    
    
    
    ========== Begin Fehlermeldung ClamAV von gestern in /var/log/clamav/clamd.log ==========
    "
    grep "`date -d yesterday +"%a %b %e"`" /var/log/clamav/clamd.log | grep -i -e error -e warn -e fail
    echo "
    ===== Ende ClamAV Logfile Auszug von gestern ==========
    
    
    
    
    ===== Begin Fehlermeldungen von gestern in /var/log/everything/ ==========
    "
    cat /var/log/everything/log-`date -I`* | grep "`date -d yesterday +"%b %e"`" | grep -i -e fail -e warn -e error
    grep "`date -d yesterday +"%a %b %e"`" /var/log/everything/current | grep -i -e error -e warn -e fail
    echo "
    ===== Ende Fehlermeldungen von gestern in /var/log/everything/ ==========
    
    
    
    
    ===== Begin Fehlermeldungen von gestern in /var/log/mail/ ==========
    "
    cat /var/log/mail/log-`date -I`* | grep "`date -d yesterday +"%b %e"`" | grep -i -e fail -e warn -e error
    grep "`date -d yesterday +"%a %b %e"`" /var/log/mail/current | grep -i -e error -e warn -e fail
    echo "
    ===== Ende Fehlermeldungen von gestern in /var/log/mail/ ==========
    Danke für Deine Hilfe.
    Bin auch weiterhin für jeden Tip dankbar


    Gruß Leon
    Wenn Microsoft die Lösung meines Problems ist, dann möchte ich gerne mein Problem wieder!

  8. #23
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von leon Beitrag anzeigen
    ...Kann ich das mit der LC_LANG denn dann auch in mein Skript einbauen?
    ...Ich will nicht das das setzen der LC meine Umgebungsvariablen vom Server komplett verhunzen.
    Innerhalb eines Scripts kannst Du problemlos Umgebungsvariablen setzen, das Script wird ja sowieso in einer Subshell ausgeführt, die Variablendefinitionen hier haben keine Auswirkung auf die startende Shell oder gar systemweite Einstellungen. Für Letzteres müsstest Du schon globale Konfig-Dateien wie /etc/profile anfassen. In meinen Beispielen habe ich nur deshalb immer wieder eine Subshell aufgemacht, damit ich verschiedene Einstellungen testen konnte und dann mit dem Verlassen dieser Shell wieder die normale Umgebung habe. Wie gesagt - in einem Script passiert das automatisch - es sei denn, Du "sourcest" es (". /pfad/zum/script" oder "source /pfad/zum/script"), dann wird es in der aktuellen Shell ausgeführt. Dann wirken Umgebungseinstellungen aber auch nur in der aktuellen Shell, nie darüber hinaus.

    Jan

  9. #24
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von leon Beitrag anzeigen
    Code:
    ...
    LC_ALL=en_EN.utf8
    ...
    grep "`date -d yesterday +"%a %b %e"`" /var/log/clamav/freshclam.log
    Das funktioniert aber nur in Deiner konkreten Umgebung, weil hier LC_ALL bereits bekannt und exportiert ist. Wenn die Variable nicht gesetzt ist, dann fehlt wieder ein "export LC_ALL=en_EN.utf8":
    Code:
    jan@jack:~/tmp> bash
    jan@jack:~/tmp> echo $LC_ALL
    
    jan@jack:~/tmp> date +"%a %b %e"
    Sa Mär 15
    jan@jack:~/tmp> LC_ALL=en_EN.utf_8
    jan@jack:~/tmp> date +"%a %b %e"
    Sa Mär 15
    jan@jack:~/tmp> export LC_ALL=en_EN.utf_8
    jan@jack:~/tmp> date +"%a %b %e"
    Sat Mar 15
    jan@jack:~/tmp> exit
    jan@jack:~/tmp> bash
    jan@jack:~/tmp> export LC_ALL=en_EN.utf_8
    jan@jack:~/tmp> date +"%a %b %e"
    Sat Mar 15
    jan@jack:~/tmp> LC_ALL=de_DE.utf8
    jan@jack:~/tmp> date +"%a %b %e"
    Sa Mär 15
    Siehst Du den Unterschied? Wenn LC_ALL einmal exportiert ist, dann kannst Du die Werte ohne erneute export-Anweisung ändern, sie sind dann auch in geforkten Kind-Prozessen bekannt. Ist die Variable aber im Environment nicht vorhanden, dann nutzt ein Setzen ohne export nichts, weil die Variable für die Kindprozesse (wie date) nicht bekannt ist.

    Der saubere Weg ist also, sie im Script immer mit "export LC_ALL=en_EN.utf_8" zu deklarieren. Auf die aufrufende Shell hat das (siehe mein voriges Posting) keinen Einfluss, der export wirkt sich immer nur "nach unten" aus und ist mit dem Ende des Scripts auch wieder vergessen.

    Jan

  10. #25
    Registrierter Benutzer
    Registriert seit
    19.06.2000
    Beiträge
    32
    hallo jan

    Vielen Dank für die super Tips. Habe jetzt alles so umsetzen können das es wunderbar funktioniert und ich es bei bedarf noch ausbauen kann.

    Wünsche noch einen schönen Sonntag



    Gruß Leon
    Wenn Microsoft die Lösung meines Problems ist, dann möchte ich gerne mein Problem wieder!

Lesezeichen

Berechtigungen

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