PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : date grep Sprachproblem



leon
09-03-2008, 12:58
Ich weiß klingt komisch aber lasst es mich erklären.

Meine localisierung ist deutsch. Demzufolge ist auch meine date ausgabe natürlich deutsch



So 9. Mär


Dummerweise sind die Datumsangaben in meinen Logfiles englisch.



Mar 9


Wie kann ich in meinen logfiles nach dem datum grabben mit dem Befehl.



date +'%D'


Das soll nur ein Beispiel sein. Ich kann es mir später noch zurecht biegen. Aber ihr seht mein Problem mit der englischen Ausgabe im Logfile und er deustchen ausgabe von date.

ContainerDriver
09-03-2008, 13:08
Hallo,

man könnte vor dem Aufruf von date die Umgebungsvariable $LANG neu setzen, zumindest hier funktioniert es.


florian@leuchtturm0:~$ echo $LANG
de_DE.utf8
florian@leuchtturm0:~$ date
So 9. Mär 14:15:25 CET 2008
florian@leuchtturm0:~$ LANG=en_EN.utf8
florian@leuchtturm0:~$ echo $LANG
en_EN.utf8
florian@leuchtturm0:~$ date
Sun Mar 9 14:15:32 CET 2008
.

Gruß, Florian

leon
09-03-2008, 13:12
Ich glaub das wäre etwas hart gegriffen. Ich habe von


LANG_TIME=C

gelesen. Leider klappt das bei mir nicht.

Vielleicht wäre das ehr ein Ansatz. Irgendwie. Wenn einer weiß wie genau es geht :rolleyes:

ContainerDriver
09-03-2008, 13:20
Ich glaub das wäre etwas hart gegriffen. Ich habe von


LANG_TIME=C

gelesen. Leider klappt das bei mir nicht.

Vielleicht wäre das ehr ein Ansatz. Irgendwie. Wenn einer weiß wie genau es geht :rolleyes:

Hmm, mit LANG_TIME funktioniert es hier auch nicht.

Was meinst du denn mit hart gegriffen? Wenn du $LANG in einer Subshell neu setzt und dort das date ausführt, passiert doch eigentlich nichts weiter?



florian@leuchtturm0:~/tmp$ cat date.sh
#!/bin/sh

echo $LANG;
date;
cmd="LANG=en_EN.utf8 && date";
datum_auf_englisch=`eval $cmd`;
echo "::"$datum_auf_englisch;
echo $LANG;
date;
florian@leuchtturm0:~/tmp$ ./date.sh
de_DE.utf8
So 9. Mär 14:28:43 CET 2008
::Sun Mar 9 14:28:43 CET 2008
de_DE.utf8
So 9. Mär 14:28:43 CET 2008

leon
09-03-2008, 13:26
Ok ich wollte es mir mal anschauen. Leider gibt es folgende Ausgabe bei mir



de_DE.utf8
So 9. Mär 14:24:23 CET 2008
::So 9. Mär 14:24:23 CET 2008
de_DE.utf8
So 9. Mär 14:24:23 CET 2008


Irgendetwas will mit meiner LANG Variable nicht ganz.

komisch


set | grep LANG
GDM_LANG=de_DE.utf8
LANG=en_EN.utf8

Und dennoch ist meine date Ausgabe deutsch

ContainerDriver
09-03-2008, 13:36
Hmm, habe gerade mal locale ausgeführt und da wurde die Variable LC_TIME angezeigt, wenn ich die mit en_EN.utf8 neu setze, dann kommt bei mir auch die englische Ausgabe:


florian@leuchtturm0:~/tmp$ cat date.sh
#!/bin/sh

locale;
date;
cmd="export LC_TIME=en_EN.utf8 && date";
datum_auf_englisch=`eval $cmd`;
echo "::"$datum_auf_englisch;
locale;
date;
florian@leuchtturm0:~/tmp$ ./date.sh
LANG=de_DE.utf8
LC_CTYPE="de_DE.utf8"
LC_NUMERIC="de_DE.utf8"
LC_TIME="de_DE.utf8"
LC_COLLATE=C
LC_MONETARY="de_DE.utf8"
LC_MESSAGES="de_DE.utf8"
LC_PAPER="de_DE.utf8"
LC_NAME="de_DE.utf8"
LC_ADDRESS="de_DE.utf8"
LC_TELEPHONE="de_DE.utf8"
LC_MEASUREMENT="de_DE.utf8"
LC_IDENTIFICATION="de_DE.utf8"
LC_ALL=
So 9. Mär 14:43:45 CET 2008
::Sun Mar 9 14:43:45 CET 2008
LANG=de_DE.utf8
LC_CTYPE="de_DE.utf8"
LC_NUMERIC="de_DE.utf8"
LC_TIME="de_DE.utf8"
LC_COLLATE=C
LC_MONETARY="de_DE.utf8"
LC_MESSAGES="de_DE.utf8"
LC_PAPER="de_DE.utf8"
LC_NAME="de_DE.utf8"
LC_ADDRESS="de_DE.utf8"
LC_TELEPHONE="de_DE.utf8"
LC_MEASUREMENT="de_DE.utf8"
LC_IDENTIFICATION="de_DE.utf8"
LC_ALL=
So 9. Mär 14:43:45 CET 2008.

Klappt das bei dir?

leon
09-03-2008, 13:44
Irgendwie nicht mein Tag heute



marko@notebookmarko ~/Skripte $ ./test
LANG=de_DE.utf8
LC_CTYPE="de_DE.utf8"
LC_NUMERIC="de_DE.utf8"
LC_TIME="de_DE.utf8"
LC_COLLATE="de_DE.utf8"
LC_MONETARY="de_DE.utf8"
LC_MESSAGES="de_DE.utf8"
LC_PAPER="de_DE.utf8"
LC_NAME="de_DE.utf8"
LC_ADDRESS="de_DE.utf8"
LC_TELEPHONE="de_DE.utf8"
LC_MEASUREMENT="de_DE.utf8"
LC_IDENTIFICATION="de_DE.utf8"
LC_ALL=de_DE.utf8
So 9. Mär 14:41:46 CET 2008
::So 9. Mär 14:41:46 CET 2008
LANG=de_DE.utf8
LC_CTYPE="de_DE.utf8"
LC_NUMERIC="de_DE.utf8"
LC_TIME="de_DE.utf8"
LC_COLLATE="de_DE.utf8"
LC_MONETARY="de_DE.utf8"
LC_MESSAGES="de_DE.utf8"
LC_PAPER="de_DE.utf8"
LC_NAME="de_DE.utf8"
LC_ADDRESS="de_DE.utf8"
LC_TELEPHONE="de_DE.utf8"
LC_MEASUREMENT="de_DE.utf8"
LC_IDENTIFICATION="de_DE.utf8"
LC_ALL=de_DE.utf8
So 9. Mär 14:41:46 CET 2008

leon
09-03-2008, 13:47
Vielleicht kann man mein eigentliches Problem ja anders lösen.
Ich möchte ein Skript schreiben welches ein Log File ausliest und mir lediglich die Zeilen ausgibt, welches das aktuelle Datum enthält.
Mir geht es darum zu sehen ob clamav oder besser freshclam ein update gemacht hat und wie es ausgegangen ist.

Mein Logfile sieht so aus



Sat Mar 8 21:48:35 2008 -> --------------------------------------
Sat Mar 8 21:48:35 2008 -> freshclam daemon 0.92.1 (OS: linux-gnu, ARCH: i386, CPU: i686)
Sat Mar 8 21:48:35 2008 -> ClamAV update process started at Sat Mar 8 21:48:35 2008
Sat Mar 8 21:48:41 2008 -> main.cvd is up to date (version: 45, sigs: 169676, f-level: 21, builder: sven)
Sat Mar 8 21:48:41 2008 -> daily.inc is up to date (version: 6173, sigs: 56718, f-level: 26, builder: ccordes)
Sat Mar 8 21:48:41 2008 -> --------------------------------------
Sun Mar 9 09:48:40 2008 -> Received signal: wake up
Sun Mar 9 09:48:40 2008 -> ClamAV update process started at Sun Mar 9 09:48:40 2008
Sun Mar 9 09:48:40 2008 -> main.cvd is up to date (version: 45, sigs: 169676, f-level: 21, builder: sven)
Sun Mar 9 09:48:40 2008 -> Downloading daily-6174.cdiff [100%]
Sun Mar 9 09:48:41 2008 -> Downloading daily-6175.cdiff [100%]
Sun Mar 9 09:48:41 2008 -> Downloading daily-6176.cdiff [100%]
Sun Mar 9 09:48:41 2008 -> Downloading daily-6177.cdiff [100%]
Sun Mar 9 09:48:41 2008 -> Downloading daily-6178.cdiff [100%]
Sun Mar 9 09:48:41 2008 -> Downloading daily-6179.cdiff [100%]
Sun Mar 9 09:48:41 2008 -> Downloading daily-6180.cdiff [100%]
Sun Mar 9 09:48:41 2008 -> Downloading daily-6181.cdiff [100%]
Sun Mar 9 09:48:41 2008 -> daily.inc updated (version: 6181, sigs: 57701, f-level: 26, builder: ccordes)
Sun Mar 9 09:48:41 2008 -> Database updated (227377 signatures) from database.clamav.net (IP: 194.47.250.218)
Sun Mar 9 09:48:41 2008 -> Clamd successfully notified about the update.
Sun Mar 9 09:48:41 2008 -> --------------------------------------
Sun Mar 9 10:26:33 2008 -> --------------------------------------
Sun Mar 9 10:26:33 2008 -> freshclam daemon 0.92.1 (OS: linux-gnu, ARCH: i386, CPU: i686)
Sun Mar 9 10:26:33 2008 -> ClamAV update process started at Sun Mar 9 10:26:33 2008
Sun Mar 9 10:26:39 2008 -> main.cvd is up to date (version: 45, sigs: 169676, f-level: 21, builder: sven)
Sun Mar 9 10:26:39 2008 -> Downloading daily-6182.cdiff [100%]
Sun Mar 9 10:26:39 2008 -> daily.inc updated (version: 6182, sigs: 57708, f-level: 26, builder: ccordes)
Sun Mar 9 10:26:39 2008 -> Database updated (227384 signatures) from database.clamav.net (IP: 65.120.238.5)
Sun Mar 9 10:26:39 2008 -> Clamd successfully notified about the update.

ContainerDriver
09-03-2008, 13:56
Habe gerade nochmal die Manpage gelesen, was bekommst du denn für eine Ausgabe bei "date -R"?

leon
09-03-2008, 14:16
super

schon mal ein prima Anfang



date -R
Sun, 09 Mar 2008 15:15:29 +0100


Jetzt muß es weiter gehen. Er muß jetzt das Format vom Log File erkennen.



Sun Mar 9


Jetzt meckert date aber über mehrere Ausgabeformate



date -R +%m


So schwer kann es doch eigentlich nicht sein, oder?

ContainerDriver
09-03-2008, 14:32
Mit date direkt wird man wohl nicht hinkommen, aber man kann die Ausgabe ja mit awk umformatieren:


florian@leuchtturm0:~$ date -R|awk '{printf("%.3s %s %d\n",$1,$3,$2)}'
Sun Mar 9
.

leon
09-03-2008, 14:45
PERFECT

Vielen lieben Dank für Eure Hilfe. Jetzt ist allesso wie ich es brauche.
Ich wünsche Euch allen noch einen schönen ruhigen Sonntag.


Gruß
Leon

leon
09-03-2008, 15:24
OK eine Kleinigkeit habe ich doch noch, Sorry!



grep "`date -R | awk '{printf("%.3s %s %d\n",$1,$3,$2)}'`" /var/log/clamav/freshclam.log


Klappt super. Jetzt möchte ich das in ein echo Befehl einbauen. Leider gibt es da Probleme.



echo "`grep "`date -R | awk '{printf("%.3s %s %d\n",$1,$3,$2)}'`" /var/log/clamav/freshclam.log`"


Ist wohl etwas zu viel des guten, hihi.
Weiß da einer noch einen Rat?

Schöner wäre glaube es mit cat zu machen



cat /var/log/clamav/freshclam.log | grep "`date -R | awk '{printf("%.3s %s %d\n",$1,$3,$2)}'`"


Das geht super. Und wie jetzt mit echo davor??

leon
09-03-2008, 15:42
Ich nehme alles zurück. Habe es mit etwas probieren doch noch alleine geschafft. Vielen Dank


Gruß Leon

jan61
10-03-2008, 20:08
Moin,


...

echo "`grep "`date -R | awk '{printf("%.3s %s %d\n",$1,$3,$2)}'`" /var/log/clamav/freshclam.log`"
...

Erste Frage: Wozu brauchst Du einen echo davor, wenn grep Dir das Ergebnis eh auf STDOUT ausgibt?

Zum date-awk-Konstrukt: Doch, der date kann das ganz allein:
jan@jack:~/tmp> LC_TIME=en_EN.utf8 date +"%a %b %e"
Mon Mar 10
Damit bist Du auch gleich die Sorge wegen des zusätzlichen Leerzeichens im printf des awk los. Da stehen nämlich 2 Blanks vor %d - das dürfte ab heute, also bei 2-stelligen Tagen für Unmut sorgen ;-) Wenn schon, dann die Formatierung lieber so: "%.3s %s %2d\n".

Deine Konstruktion oben hat schlicht und einfach ein paar Fehler. Du musst richtig escapen, dann klappts auch (ungetestet, hab grad kein clamav-Log da):

echo "`grep \"\`date -R | awk '{printf(\\\"%.3s %s %2d\n\\\",$1,$3,$2)}'\`\" /var/log/clamav/freshclam.log`"
Nich so hübsch, ne? Vielleicht ist dann ja die Variante mit date allein doch besser:
LC_TIME=en_EN.utf8 grep "`date +\"%a %b %e\"`" /var/log/clamav/freshclam.logUnd wenn Du mir verrätst, warum Du unbedingt ein echo brauchst (die Ausgabe sieht genauso aus ohne), dann verrate ich auch, wie das geht ;-)

Jan

leon
11-03-2008, 04:50
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


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


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

jan61
11-03-2008, 18:45
Moin,


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


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


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

leon
11-03-2008, 20:03
Hi

Danke für Deine Hilfe.

Also folgendes habe ich gemacht



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.


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 :-)


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


echo "`grep \"\`date -R | awk '{printf(\\\"%.3s %s %2d\n\\\",$1,$3,$2)}'\`\" /var/log/clamav/freshclam.log`"



Vielen Dank
Leon

jan61
11-03-2008, 20:31
Moin,


...


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:

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

Könntest Du mir bitte diese Zeile ohne echo geben


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:


grep "`date -R | awk '{printf(\"%.3s %s %2d\n\",$1,$3,$2)}'`" /var/log/clamav/freshclam.log
Jan

leon
13-03-2008, 10:12
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




#!/bin/bash

/bin/bash
LC_ALL=en_EN.utf8

.
.
.
.
.
.
.
.
.
.
exit


Ich will nicht das das setzen der LC meine Umgebungsvariablen vom Server komplett verhunzen.

leon
13-03-2008, 16:44
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



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

leon
13-03-2008, 20:00
So habe es jetzt hin bekommen. Habe es etwas anders gemacht wie gedacht, aber es geht super




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

jan61
14-03-2008, 23:35
Moin,


...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

jan61
15-03-2008, 00:00
Moin,



...
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":

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

leon
16-03-2008, 07:48
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