Programm, um Textdateien umzubasteln?

Post Reply
Message
Author
DanyaelDavey

Programm, um Textdateien umzubasteln?

#1 Post by DanyaelDavey »

Morgen :)
Weiß nicht, ob ich als Macianer hier richtig bin, aber ich glaube mal schon ;)

Ich nutze Mac OS X 10.3.4 (basiert auf den Darwin - Kernel von BSD) und bin mit der Programmierung nicht so wirklich bewandert ...

Ich stehe vor dem Problem, dass ich eine Textdatei (Mac - spezifische Logdatei) überarbeitet haben möchte. Das Problem: die Datei hat ne Größe vonknapp 2 GB, also fällt ne Bearbeitung von Hand schon mal flach.
Das Mac - spezifische Zeilenende in ein Unix - Zeilenende umzuwandeln war (tr sei Dank) kein Problem, aber für die folgende Bearbeitung reichen Shell - Befehle meines Wissens nach nicht aus.

Das File entspricht in Etwa dem CLF (common log format), welches auch Apache liefert.
Der Aufbau wäre dann in Etwa

Code: Select all

ip - - [datum] - "aktion url"


Die URL signalisiert eine Datenbankabfrage über FileMaker ... Ein Eintrag sieht etwa so aus:

Code: Select all

127.0.0.1 - - [01/Jan/2004 12:34:56] - "GET http://server/FMPro?autor=ich&titel=dieser&id=12345&native=true&layout=&dies=das&soweiter=&sofort=;"



Ich würde jetzt gerne die URL dahingehend beschnitten haben, dass ledig http://server/FMPro?id=12345 übrig bleibt, IP, Datum und Aktion sollen erhalten bleiben.

Allerdings können sämtliche Variablen Einträge unterschiedlicher Länge haben, weshalb die genaue Angabe der Position der zu entfernenden Strings sowie die wörtliche Angabe der zu entfernenden Strings nicht möglich ist.

Hätte jemand eine Idee, wie sich das realisieren läßt?

Oder kann man vielleicht auch irgendwie mittels grep definieren, das nicht passende Strings angegeben und per tr entfernt werden? :roll:
Ist es überhaupt möglich, in grep mit dem wildcard ? zu arbeiten?
Und wenn ja, wie?
(kommt mir jetzt bitte nicht mit rtfm, Ihrtfmmtt und über wildcards steht da nüscht hilfreiches)

Ach so, die ID ist immer 5stellig.

Schon mal vielen Dank für eure Mühen :)

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

#2 Post by jochen »

Nun kenne ich Darwin so rein gar nicht, aber awk sollte als Standard-UNIX-Tool vorhanden sein. perl ist sicherlich auch vorhanden, aber damit kenne ich mich nicht so gut aus. Fangen wir erst mal an, ob awk vorhanden ist:

Code: Select all

which awk
verrät Dir, ob awk im Suchpfad ist. Wenn "/usr/bin/awk" oder ähnliches ausgegeben wird, ist der awk vorhanden und der Rest des Postings macht für Dich Sinn. :-)

Code: Select all

awk -F \" '
$2 ~ /http:\/\/server\/FMPro\?/ {
        qm_pos = index ($2, "?")
        url_begin = substr($2,1,qm_pos)
        args=substr ($2,qm_pos+1)
        match (args,/id=...../)
        args=substr(args,RSTART,RLENGTH)
        print $1 "\"" url_begin args "\""
        next
}

{ print }'
"-F \"" setzt als Trenner das Anführungszeichen. Damit ist das zweite Feld ($2) immer der Inhalt in den Anführungszeichen.

Nur wenn "http://server/FMPro?" in dem Feld vorkommt, wird die folgende Aktion (in { }) ausgeführt.

url_begin wird auf "Alles aus $2 bis zum ersten Fragezeichen inklusive" gesetzt, args auf "Alles aus $2 ab dem ersten Fragezeichen exklusive".

match setzt RSTART und RLENGTH auf Position und Länge des Treffers für den Regulären Ausdruck "id=.....", substr setzt die dort stehende Zeichenkette neu für args ein.

print gibt die Zeile neu zusammengesetzt wieder aus, inkl. neu gesetztter Anführungszeichen (da diese als Trennzeichen ja weggefallen sind).

next leitet die Bearbeitung der nächsten Zeile ein.

Alle anderen Zeilen werden durch die "{ print }" -Aktion unverändert wieder ausgegeben.

Pack das Skript in eine Datei, mach sie ausführbar und ruf es mit dem Log in der Standardeingabe auf. Es schreibt das modifizierte Log nach stdout, also kannst Du es einfach in eine neue Datei umlenken:

Code: Select all

./massiere_urls.sh <mein.log >mein-neues.log
Vorsicht! Nicht so umlenken: "<mein.log >mein.log" Dadurch würdest Du das Log auf 0 Byte Grösse setzen, bevor es bearbeitet wird!

Jochen
Die grösste Lüge der EDV? "Mal eben..."

DanyaelDavey
Posts: 3
Joined: 09. Jun 2004 8:12

Besten Dank :)

#3 Post by DanyaelDavey »

Also zum Ersten: /usr/bin/awk -- gibs :D

Zum Zweiten:
Hervorragend, vielen herzlichen Dank :mrgreen:

Ums in alter Mac - Manier zu sagen: it works :lol:

Wie gesagt, vielen Dank für deine schnelle Hilfe!
Gibt es irgendwo eine Befehlsreferenz für awk?
Scheint ja ein nettes Tool zu sein ...

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

#4 Post by jochen »

Versuch's mal mit "man awk" oder "info awk". Speziell wenn Du den GNU awk (gawk) installiert hast, sind die info-Seiten schwer zu empfehlen. Allerdings alles auf Englisch. Zum awk findet man auch im Netz einiges, wenn ich auch jetzt keine Links parat habe.

Allerdings würde ich Dir eher dazu raten, perl zu lernen. Es ist wesentlich mächtiger als der awk und wird Dich weiter bringen als es der awk kann. Ich persönlich bin nur schon so auf den awk eingeschossen, dass ich beim Programmieren nicht lange nachdenken oder nachschlagen muss - bis ich das auch in perl schaffe, fliesst noch ein bisschen Wasser den Rhein runter...

Jochen
Die grösste Lüge der EDV? "Mal eben..."

DanyaelDavey
Posts: 3
Joined: 09. Jun 2004 8:12

#5 Post by DanyaelDavey »

Perl also ...
Werd mich damit mal auseinandersetzen.

Post Reply