PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeilenweises auslesen einer Textdatei?



mobas
15-10-2004, 09:08
Hallo Forum!

Ich habe folgendes Problem.
In einer Logadatei sind Einträge folgenden Formates:
IDENTIFIER TIMESTAMP T C RESOURCE_NAME DESCRIPTION
B6048838 1008100504 P S SYSPROC Messagetext1
5DFED6F1 1004150304 I O SYSPFS Messagetext2


Aus einer externen Textdatei (lastdate.txt) lese ich das letzte Datum (1004150304) aus - dazu später noch was.

Nun will ich Zeilenweise die Logdatei durchgehen und den Timestamp mit dem des letzten vergleichen. Wenn auf ein neueres Datum gestoßen wird soll eine Aktion ausgeführt werden.
Zum Beispiel steht als letztes Datum "1004150304", der neuere Eintrag in der Logdatei ist "1008100504" -> jetzt soll eine Aktion ausgeführt werden! Zusätzlich soll der dazugehörige Text (description) in eine Variable gespeichert werden.

Das Datum soll dann in einer extra Variable zwischengespeichert werden,
so das zu guter letzt in dieser Variable das aktuellste Datum aus der Logdatei steht. Diese wird dann am Schluss des Scriptes in die lastdate.txt geschrieben.

Das größte Problem hierbei ist das Zeilenweise auslesen der Logdatei.
Ich hoffe Ihr könnt mir hierbei helfen!!!

Vielen Dank schon mal vorab!

Gruß
mobas

Blackhawk
15-10-2004, 09:39
cat datei.txt | while read line
do
verwurschtel $line
done

mobas
15-10-2004, 10:05
Hallo Blackhawk!

Das klappt ja wunderbar! :)
Die Ausgabe gibt ja nun Zeile für Zeile aus.
Weist DU denn auch noch zufällig wie man jeden einzelnen Abschnitt
ausschneidet und in Variablen packt? sprich: TIMESTAMP und DESCRIPTION .
Damit ich die den Timestamp vergleichen kann und bei bedarf, falls der aktuelle neuer ist, die Description auch in eine Variable speicher.

Vielen Dank für Deine Mühe!!!

Gruß
mobas

peschmae
15-10-2004, 19:41
Geht am coolsten mit Awk:



echo $line | awk '{ print $2 }'


um den Timestamp zu kriegen, etc

MfG Peschmä

mobas
18-10-2004, 09:36
Hi peschmae!

Danke für diesen Tip!!! :)
Funktioniert wunderbar.

Aber eine Frage hab ich da noch:
Nun wird die Zeile ja behandelt wie übergebende Argument.
Wie kann ich denn am einfachsten die komplette Nachricht als 1 Argument auslesen?
Also nur die Description.
Angenommen ein Dateieintrag sieht wie folgt aus:

B6048838 1008100504 P S SYSPROC Das ist die Description in mehreren wörtern

So würde die Nachricht ja aus den Argumenten $6 bis $12 bestehen.
Wie kann ich diese Nachricht am komfortabelsten und einfachsten rausfiltern und in eine Variable speichern?
Also alles ab $6 bis zum Ende ist die Nachricht.
Ohne jetzt irgendwie ne kompliziert Schleife zu bauen.
Wenn das auch mit awk funktionieren würde wär das super - denn das läuft auf der Maschine hier wunderbar. Vielleicht ist das von wichtigkeit - ich arbeite hier mit der ksh.

Vielen Dank schon mal für deine große Hilfe!!!

Gruß
mobas

p.s.: wie bekomme ich die "$line | awk '{ print $2} '"-Ausgabe in ne Variable gespeichert?
Hab nach einigen möglichkeiten hier gesucht, aber leider nichts gefunden was mit meinem Problem funktioniert.

mobas
18-10-2004, 14:52
Hi!

Man bin ich besche....!!! :rolleyes:
Hab ich gepennt? Vergesst einfach die p.s.-Frage am Schluss!!!!!!!!
Naja - kann ja mal passieren. *kopfauftischschlagen*

Aber nichts desto trotz such ich jetzt noch ne möglichkeit aus dem String alles ab dem $6 Argument in eine Variable zu schreiben.
Wenigstens das irgendwie über awk abzuschneiden.

Vielen Dank!!!

Gruß
mobas

peschmae
18-10-2004, 18:22
Keine Ahnung ob sowas mit Awk einfach geht - kannst natèrlich eine Schleife machen die einfach ab $6 raufzàhlt und jeweils $n ausgibt.

Eventuell ist da auch Sed besser geeignet. Einfach sowas
".*\ " (ohne ") ersetzen lassen:
sed s#.*\ ##
und schon ist der erste Teil des Ausdrucks weg - entsprechend léschst du einfach den Rest - also
".*\ .*\ " etc
Gibt auch so ein Wiederholungsding in Sed wo du sagen kannst wieviel mal eine Regexp nacheinander gelten soll, weiss aber gerade nicht mehr wie das geht.

MfG Peschmà

peschmae
19-10-2004, 08:49
Oh, patzer. Sed ist immer greedy, d.h. es versucht die Regexp so gross wie möglich zu machen.
".*\ " matcht deshalb bis zum letzten Leerzeichen :(

Das da geht:


echo $line | sed "s#[^\ ]*\ [^\ ]*\ [^\ ]*\ [^\ ]*\ [^\ ]*\ ##"


und das hier ist etwas kürzer - in Klammern die Anzahl "Datensätze" die zu entfernen sind:



echo $line | sed "s#\([^\ ]*\ \)\{5\}##"

mobas
20-10-2004, 09:37
Hi peschmae!

Vielen Dank für Deine Hilfe!!!!
Das Script funzt jetzt wie es soll. :D


DATEFILE=lastdate
ERRORLOG=errormsg.txt
LASTDATE=`cat $DATEFILE`
cat $ERRORLOG | while read line
do
CURENTDATE=`echo $line | awk '{print $2}'`
if [ $CURENTDATE -gt "$LASTDATE" ]
then
CURENTMSG=`echo $line | awk '{print $6,$7,$8,$9,$10,$12,$13}'`
# sms-gateway
echo $CURENTDATE > $DATEFILE
fi
done


Vielen Dank noch mal!!!

Gruß
mobas