date und grep -> logfile

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
jeorsch
Beiträge: 22
Registriert: 12.07.2004 14:34:22

date und grep -> logfile

Beitrag von jeorsch » 02.08.2004 08:39:32

hallöle,

ich hab da ein keines problem bei dem ich eure hilfe brauche....

in einem script greppe ich mehrere unterschiedliche logfiles

Code: Alles auswählen

datum = `date '+%b %d'`
cat $datei |grep $datum >> $datei2 
funzt auch einwandfrei, nur sobald ich einen tag habe, der unter dem tag 10 eines monats ist,
wird nicht mehr gefiltert, da der eingetragene wert nicht 01, oder 02, ... sondern 1, 2, 3 ist.
nun suche ich eine möglichkeit, dieses format abzufangen...

mfgle

Benutzeravatar
QT
Beiträge: 1322
Registriert: 22.07.2004 21:08:02
Wohnort: localhost

Beitrag von QT » 02.08.2004 09:20:47

Hilft denn die Verwendung von %e als field descriptor? Bei dieser Variante wird statt einer fuehrenden 0 einfach ein Leerzeichen genommen.

Code: Alles auswählen

%e Displays the day of the month as a decimal number (1-31). In a two-digit field, a blank space is used as leading space fill.
Hmm, ja, vermutlich hast Du dann nachwievor keine Treffer mit dem 'grep' Kommando, weil dann wohl 2 Leerzeichen im Pattern enthalten sind, die sich aber so nicht im Logfile befinden. Da hilft es womoeglich das Pattern zu generieren, in dem Du 2 seperate Variablen (Monat und Tag) zuweist. Vielleicht so.....!?

Code: Alles auswählen

MONAT=`date '%b'`
TAG=`date '%e'`
if [ $TAG -le 9 ]; then
    PATTERN="${MONAT}${TAG}"
else
    PATTERN="${MONAT} ${TAG}"
fi
grep $PATTERN $datei >> $datei2
Im uebrigen hast Du Dir den "Award fuer useless use of cat" verdient. :lol:

HTH.

jeorsch
Beiträge: 22
Registriert: 12.07.2004 14:34:22

hmmm

Beitrag von jeorsch » 03.08.2004 08:26:44

jepp, mit dem cat muss ich dir wohl recht geben..... :(

nur habe ich wirklich auch bei deinem beispiel das problem, daß dieses zusätzliche leerzeichen nicht berücksichtigt wird...

sobald ich irgend ein zeichen setze

Code: Alles auswählen

...PATTERN="${MONAT}.  ${TAG}"

echo $PATTERN
Aug.  3

funzt das, anders herum nicht.....
*grübel*

Benutzeravatar
mistersixt
Beiträge: 6601
Registriert: 24.09.2003 14:33:25
Lizenz eigener Beiträge: GNU Free Documentation License

Beitrag von mistersixt » 03.08.2004 09:57:04

Vielleicht mit sed die Null vorne rausgrabbeln (ich hoffe, ich habe Dein Problem richtig verstanden):

Code: Alles auswählen

mars:/tmp# tag=`date '+%d' | sed 's/^0//'`
mars:/tmp# monat=`date '+%b'`
mars:/tmp# datum="$monat $tag"
mars:/tmp# echo $datum
Aug 3
mars:/tmp# 
Gruss, mistersixt.

jeorsch
Beiträge: 22
Registriert: 12.07.2004 14:34:22

Beitrag von jeorsch » 03.08.2004 13:04:35

hmm also hier nochmal dat janze kurze script

Code: Alles auswählen

#!/bin/bash

MONAT=`date '+%b'`
TAG=`date '+%d' | sed 's^0//'`
DATEI=/var/log/logfile

if [ $TAG -le 9 ]; then
  PATTERN="$MONAT$TAG"
else
  PATTERN="$MONAT  $TAG"
fi

echo $PATTERN
grep $PATTERN $DATEI
in der bash funzt z.b.

Code: Alles auswählen

date '+%b %e'
im script mit übergabe an die variable datum funzt das net

Code: Alles auswählen

datum=`date '+%b %e'`
echo $datum

übrigens vorerst ein dank alle alle beteiligten...

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 03.08.2004 13:18:14

hi.. also in deinem kurzen Script gibt es (vielleicht ein Copy-Paste) Fehler:

Code: Alles auswählen

TAG=`date '+%d' | sed 's^0//'`         <--- da fehlt ein "/" hinter dem "s"
also:
TAG=`date '+%d' | sed 's/^0//'`        <---- müsste so aussehen
und bei mir funzt auch

datum=`date '+%b %e'`
echo $datum

wunderbar.. nur das in der Shell zwischen "Aug" und "3" zwei Leerzeichen geschrieben werden und im Script sieht man dank "echo" nur ein Leerzeichen.. warum auch immer.

oder wolltest du expliziet 2 Leerzeichen?
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

jeorsch
Beiträge: 22
Registriert: 12.07.2004 14:34:22

Beitrag von jeorsch » 03.08.2004 13:34:00

sorry,
in dem script war ein copy/paste fehler
in meinem script war das zeichen an der richtigen stelle ;)

das problem ist, daß im logfile bei dem zu filternden wert
z.b.:
Aug 10 (1 leerzeichen)
geschrieben wird,

sobald aber der tag unter den 2stelligen wert rutscht
z.b.:
Aug 1 (2 leerzeichen) erscheinen und ein normales filtern nicht mehr hinhaut.
echo im script, entfernt immer das zusätzlich angegebene leerzeichen,
so daß immer nur ein leerzeichen an das pattern übergeben wird und dadurch der aktuelle tag nicht mehr ausgegeben werden kann.

....

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 03.08.2004 13:48:57

hmm sowieso komisch das es bei mir je nachdem obs direkt in der konsole oder im script gemacht wird mal ein und mal zwei leerzeichen ausgibt (beim 3. August!!)

aber hier ein Tip wie man das Problem (wenn auch dirty) lösen kann..

mache dies:

Code: Alles auswählen

datum=`date '+%b %e' |  sed -e 's/\(.*\) \( .*\)/\1\2/'`
und dann müsste es eigentlich gehen (zumindest bei meinem kleinen Versuch eben..)
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
mistersixt
Beiträge: 6601
Registriert: 24.09.2003 14:33:25
Lizenz eigener Beiträge: GNU Free Documentation License

Beitrag von mistersixt » 03.08.2004 14:36:34

Du musst am Ende Deines Scriptes dieses ausführen:

Code: Alles auswählen

...
grep "$PATTERN" $DATEI
Also das in Anführungsstrichen machen. Guckst Du hier:

Code: Alles auswählen

mars:/tmp# test1="Aug"
mars:/tmp# test2=" 3"
mars:/tmp# test3="$test1 $test2"
mars:/tmp# echo $test3
Aug 3
mars:/tmp# echo "$test3"
Aug  3
mars:/tmp# 
Gruss, mistersixt.
--
System: Debian Bookworm, 6.11.x.-x-amd64, ext4, AMD Ryzen 7 3700X, 8 x 3.8 Ghz., Radeon RX 5700 XT, 32 GB Ram, XFCE

jeorsch
Beiträge: 22
Registriert: 12.07.2004 14:34:22

Beitrag von jeorsch » 03.08.2004 17:55:34

jau, funzt nun super

hier nochmal der code, um das thema abzuschließen

Code: Alles auswählen

#!/bin/bash

MONAT=`date '+%b'`
TAG=`date '+%e'`
DATEI=/var/log/mail

if [ $TAG -le 9 ]; then
  PATTERN="$MONAT $TAG"
else
  PATTERN="$MONAT$TAG"
fi

grep "$PATTERN" $DATEI
dank an alle nochmals
mfgle

Antworten