datei auslesen von bis

keek

keek

BangBoomBang
Hallo
ich bin neu hier.. also erst mal Hallo!!
ich habe eine frage:
wie kann ich aus einem log-file text blöcke aus lesen?
also Beispiel:
Code:
2010-06-14 10:30:23,345 Error 
bla bla
bla bla
bla bla
2010-06-14 10:31:24,234 Error
bla
.....
und jetzt möchte ich immer einen ganzen block auslesen (von [Datum /Uhrzeit] bis [vor nächstes [Datum/Uhrzeit]]).
Das ganze sollte am besten in ein -tmp file gespeichert werden.
ich habe an grep oder set gedacht.. komme aber nicht weiter

freu mich auf ne antwort

liebe grüße keek
 
Nur ein Textblock oder alle in einer Datei vorkommenden Textblöcke.......
(also quasi die gesamte Log-Datei verarbeiten)

Wie sollen die Textdateien nachher heißen....?
(vermutlich sollen diese dann das Datum im Dateinamen haben....)

Kannst Du mal einen Ausschnitt aus einer originalen Logdatei mit 3-4 Textblöcken posten....
(an echten Daten lässt sich die Aufgabe besser lösen.)
 
Code:
2010-06-13 22:44:37,663 ERROR [Connection.ReaderThread:Socket[addr=gdcentos5.index.de/10.54.48.115,port=33030,localport=40916]] (?:?) - send failed
java.net.SocketException: Broken pipe
	at java.net.SocketOutputStream.socketWrite0(Native Method)
	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
	at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
	at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(StreamEncoder.java:336)
	at sun.nio.cs.StreamEncoder$CharsetSE.implFlushBuffer(StreamEncoder.java:404)
	at sun.nio.cs.StreamEncoder$CharsetSE.implFlush(StreamEncoder.java:408)
	at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:152)
	at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:213)
	at java.io.BufferedWriter.flush(BufferedWriter.java:230)
2010-06-13 22:44:44,622 ERROR [Connection.ReaderThread:Socket[addr=gdcentos5.index.de/10.54.48.115,port=54775,localport=51151]] (?:?) - send failed
java.net.SocketException: Broken pipe
	at java.net.SocketOutputStream.socketWrite0(Native Method)
	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
	at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
	at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(StreamEncoder.java:336)
	at sun.nio.cs.StreamEncoder$CharsetSE.implFlushBuffer(StreamEncoder.java:404)
	at sun.nio.cs.StreamEncoder$CharsetSE.implFlush(StreamEncoder.java:408)
	at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:152)
	at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:213)
	at java.io.BufferedWriter.flush(BufferedWriter.java:230)

Das sind jetzt 2 so Blöcke.
ich möchte nun daraus den ersten ERROR-Block auslesen und in eine [Datum&Uhrzeit].tmp datei packen. Dann den zweiten ERROR-Block in eine [Datum&Uhrzeit].tmp.. und so weiter..
am schluss möchte ich eben von jedem ERROR-Block eine Datei haben.
 
Code:
[FONT="Courier New"]#!/bin/bash

DATUM=""

while read AKT_ZEILE; do

case $AKT_ZEILE in
        [0-9][0-9][0-9][0-9]-[0-9][0-9]-*)
                DATUM="`echo $AKT_ZEILE | cut -d' ' -f1-2 | sed -e 's/ /_/g;s/:/_/g;s/,/_/g'`"
                echo $AKT_ZEILE >> $DATUM.tmp
                ;;

        *)      if [ "$DATUM" != "" ]; then
                        echo $AKT_ZEILE >> $DATUM.tmp
                fi
                ;;

esac

done < lesedieseslogfile.log[/FONT]
 
Ich habe noch eine frage.
Sie passt zu "sed" und "etwas aus einer Datei auslesen".
Deshalb schreib ich gleich hier rein.

Und zwar... ich habe folgendes File:

Code:
CentOS
 Error          30  | 33  | 33  | ende.aut.gdcentos5.error
 Warn	  20  | 20  | 20  | ende.aut.gdcentos5.warn
 Fatal	   0   | 0   | 0   | ende.aut.gdcentos5.fatal

Fedora11
 Error         12   | 23   | 32   | ende.aut.gdfedora11.error
 Warn        13  | 46   | 23   | ende.aut.gdfedora11.warn
 Fatal	 45   | 45  | 45  | ende.aut.gdfedora11.fatal

nun möchte ich beispielsweise die Zeile suchen in der "ende.aut.gdcentos5.warn" steht und da die letzte Zahl (also in diesem fall die 20) in eine Variable (bsp.:"Zahl") speichern.

wie kann ich das machen?

Danke schon mal im vorraus
 
Code:
grep "ende.aut.gdcentos5.warn" meinedatei.log | cut -d"|" -f3
 
Sorry.. ich hab nich nich richtig ausgedrückt..
und zwar habe ich in manchen Zeilen auch mehrere zahlen.
mit
Code:
-f3
fragst man ja die dritte Zahl ab.
aber in manchen Zeilen gibt es auch mehrere zahlen.
Ich brauch immer die letzte.

aber danke schon mal für die antwort!
 
okay.. habs raus gefunden.. durch deine idee..
ist aber nicht sehr schön:

grep "ende.aut.gdcentos5.warn" statistik.txt | rev | cut -d"|" -f2 | rev

wenn du was schöneres hast, wär das besser
 
Hi,

in der Annahme dass es immer das vorletzte Feld ist, und die Felder alle mit "|" getrennt sind, laesst sich das z.B. auch mit awk oder parameter expansion machen:

Beispiel Zeile in foo:
Code:
$ foo=" Fatal 45   | 45  | 45  | ende.aut.gdfedora11.fatal"

Mit awk das vorletzte Feld ausgeben:
Code:
$ echo $foo | awk -F'|' '{field=NF-1;print $field;}'
 45

Mit parameter expansion erst alles vom Ende bis zum ersten "|" loeschen, und dann alles vom Anfang bis zum letzten "|":
Code:
$ bar=$(echo ${foo%\|*})
$ echo $bar
Fatal 45 | 45 | 45
$ echo ${bar##*\|}
45

mfg,
bytepool
 

Ähnliche Themen

Datum innerhalb einer Datei wandeln dd.mm.jjjj auf jjj-mm-dd

Dateien nach Datum finden

Akonadi startet nicht mehr

Mein Server versendet SPAM in Massen

mittels if abfrage datei nach variabelnwert durchsuchen

Zurück
Oben