Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
Programm, um Textdateien umzubasteln?

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - Allgemein
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
DanyaelDavey
Gast





BeitragVerfasst am: 09. Jun 2004 8:08   Titel: Programm, um Textdateien umzubasteln?

Morgen Smile
Weiß nicht, ob ich als Macianer hier richtig bin, aber ich glaube mal schon Wink

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:
ip - - [datum] - "aktion url"


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

Code:
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? Rolling Eyes
Ist es überhaupt möglich, in grep mit dem wildcard ? zu arbeiten?
Und wenn ja, wie?
(kommt mir jetzt bitte nicht mit rtfm, Ihrtfmmtt [I have rtfm more than twice] und über wildcards steht da nüscht hilfreiches)

Ach so, die ID ist immer 5stellig.

Schon mal vielen Dank für eure Mühen Smile
 

jochen
prolinux-forum-admin


Anmeldungsdatum: 14.01.2000
Beiträge: 699
Wohnort: Jülich

BeitragVerfasst am: 09. Jun 2004 10:44   Titel:

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

Code:
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:
./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..."
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

DanyaelDavey



Anmeldungsdatum: 09.06.2004
Beiträge: 3

BeitragVerfasst am: 09. Jun 2004 16:23   Titel: Besten Dank :)

Also zum Ersten: /usr/bin/awk -- gibs Very Happy

Zum Zweiten:
Hervorragend, vielen herzlichen Dank Mr. Green

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

Wie gesagt, vielen Dank für deine schnelle Hilfe!
Gibt es irgendwo eine Befehlsreferenz für awk?
Scheint ja ein nettes Tool zu sein ...
 
Benutzer-Profile anzeigen Private Nachricht senden

jochen
prolinux-forum-admin


Anmeldungsdatum: 14.01.2000
Beiträge: 699
Wohnort: Jülich

BeitragVerfasst am: 09. Jun 2004 18:08   Titel:

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..."
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

DanyaelDavey



Anmeldungsdatum: 09.06.2004
Beiträge: 3

BeitragVerfasst am: 10. Jun 2004 7:08   Titel:

Perl also ...
Werd mich damit mal auseinandersetzen.
 
Benutzer-Profile anzeigen Private Nachricht senden

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - Allgemein Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy