siryasokuhl Geschrieben 22. März 2007 Teilen Geschrieben 22. März 2007 Hallo Leute, ich will ein Logfile von einem import Vorgang mittels awk bearbeiten. Mein Ziel ist es eine neue Datei zu erhalten, die nur die fehlgeschlagenen Vorgänge zeigt. Jeder Vorgang beginnt mit ==> am Anfang und endet in der letzten Zeile mit "Failed", "OK" oder "Skiped". Dazwischen können beliebig viele Zeilen stehen. Gut wäre es auch noch, wenn ein oder mehrere "Failed" gefunden wurden die Zeilen mit ** auch ausgegeben würden. Eine davon reicht aus. Es geht nur darum die Kategorie zu wissen. Da ich leider keine Ahnung von Awk habe, habe ich bereits etwas rumgegoogelt und was gefunden um das skript umzudrehen. Also letzte Zeile zu Erst. awk '{ line[NR] = $0 } END { for ( i = NR; i > 0; i-- ) print line }' $1 Jetzt müßte ich nur noch irgendwas finden/haben mit dem man den ganzen Text zwischen dem Failed und den ==> ausgibt. Und anschließend wieder umdrehen. Ich bin mir sicher das es auch einfacher geht, aber wie?? Ich danke euch schon mal für Eure Hilfe. So sieht das Logfile aus. ==> Process shell script 10_stop_emarketserver.sh eMarketServer wurde erfolgreich beendet. [70G[1A[[1;32m OK [0;39m] ** ** Finished with directory 10_prepare ************************************************************** ************************************************************** ** Process directory 20_export ** ==> Process shell script 10_backup_export_dir.sh save D:/temp/sql to D:/temp/archive chdir D:/temp/archive failed [70G[1A[[1;31mFailed[0;39m] ==> Process shell script 20_export_db.sh directory D:/temp/sql doesn't exist [70G[1A[[1;31mFailed[0;39m] ** ** Finished with directory 20_export ************************************************************** Das Kryptische sind Escape-Sequenzen, die für die farbliche hervorhebung von "OK" und "Faild" sorgen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
alligator Geschrieben 22. März 2007 Teilen Geschrieben 22. März 2007 Hallo, ich würde dir für die Aufgabe Perl empfehlen. Ist genau dafür gemacht worden. Falls du es dennoch in awk machen willst hier mal eine Einführung für awk: awk - Eine Einführung Falls du nach der Lektüre nicht weiter kommst, dann poste doch mal deinen Code und die Probleme/Ergebnisse. ciao, alligator Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
siryasokuhl Geschrieben 23. März 2007 Autor Teilen Geschrieben 23. März 2007 Ja das mit perl ist mir schon klar. Aber mir geht es auch darum das den awk mal richtig zu verstehen. Ich habe auch schonmal ein paar kleiner suchen damit durchgezogen. Aber halt immer nur das übliche, suche ein Muster und ersetze es. Im Moment hänge ich jetzt dabei diesen ganzen block auszugeben zwischen Failed und ==>. Ich danke dir schonaml für das HowTo, es ist doch schon Umfassender als die Anderen, die ich bis jetzt gefunden habe. Ich werde das jetzt erstmal durchgehen und mich bei Problemen wieder melden. Vielen Dank soweit. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
alligator Geschrieben 23. März 2007 Teilen Geschrieben 23. März 2007 Hi, schau dir mal getline an. ciao, alligator Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
siryasokuhl Geschrieben 23. März 2007 Autor Teilen Geschrieben 23. März 2007 Hallo nochmal, ich habe jetzt mit der Hilfe von Alligator's HowTo eine fast brauchbares Skript zusammen. ( Es geht bestimmt irgendwie einfacher, ohne Tempfiles ). Mein Problem ist die Ausgabe der Sternchen-Zeilen. Denn so wie es im Moment ist haut es mir ja immer alle dieser Zeilen raus. Ich will aber nur die Zeilen in dessen Sektion auch ein Failed war. Aktuell habe ich jetzt zwei Skripte, eines das mit die Logfiles zurecht dreht und eines das die Formatierung übernimmt. Ausführendes Skript #!/bin/sh tempfile="rev_input" tempfile2="rev_output" touch $tempfile touch $tempfile2 # Umdrehen des Logs awk '{ line[NR] = $0 } END { for ( i = NR; i > 0; i-- ) print line }' $1 > $tempfile # Formatieren awk -f awk.skript $tempfile > $tempfile2 # Zurueckdrehen awk '{ line[NR] = $0 } END { for ( i = NR; i > 0; i-- ) print line }' $tempfile2 > failed.log rm -f $tempfile rm -f $tempfile2 awk.skript: BEGIN { ff=0 show=0 import=0 } /Failed/ {ff=1;import=1;show=1} /^[^\*]/ {if(ff>0){print}} /==>/ {ff=0} /\*\*/ {if(show>0){print}} /\*{4}/ {if(show>0){print;show=0}} /^Import/ {if(import>0){print;import=0}} Das kommt dabei raus: ************************************************************** ** Process directory 20_export ** ==> Process shell script 10_backup_export_dir.sh save D:/temp/sql to D:/temp/archive chdir D:/temp/archive failed [70G[1A[[1;31mFailed[0;39m] ==> Process shell script 20_export_db.sh directory D:/temp/sql doesn't exist [70G[1A[[1;31mFailed[0;39m] ** ** Finished with directory 20_export ************************************************************** ************************************************************** ** Process directory 30_remove ** ** ** Finished with directory 30_remove ************************************************************** ************************************************************** ** Process directory 40_create_database_schema_roles ** ** ** Finished with directory 40_create_database_schema_roles ************************************************************** Ich bin wie immer für Eure Hilfe dankbar. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
alligator Geschrieben 23. März 2007 Teilen Geschrieben 23. März 2007 Hi, poste mal genau (also ein Beispiel), was du für ein Ergebnis haben möchtest und schaus mir heut abend mal an ... ciao, alligator Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
siryasokuhl Geschrieben 23. März 2007 Autor Teilen Geschrieben 23. März 2007 Vielen Dank für das Angebot. Ich finde es total klasse von Dir, dass Du Deine Freizeit dafür Opfern willst. Normalerweise müßte ich jetzt Dankbar ablehnen und irgendwas schreiben über .... das es nicht nötig wäre. Aber in diesem Fall bin ich Egoist ^^. Auf alle Fälle schonmal ein ganz dickes Danke. Wenn das wirklich bis Montag früh so läuft, wie ich mir das Vorstelle, dann schicke cih Dir ne tüte Gummibären als Entschädigung. Dies ist ein größerer Ausschnitt aus dem logfile (file Größe bis zu mehrere GB) logfile: Import Customer XXXXX Umgebung local ************************************************************** ** Process directory 10_prepare ** ==> Process PHP script 01_destroysession.php [70G[1A[[1;32m OK [0;39m] ==> Process shell script 10_stop_emarketserver.sh eMarketServer wurde erfolgreich beendet. [70G[1A[[1;32m OK [0;39m] ** ** Finished with directory 10_prepare ************************************************************** ************************************************************** ** Process directory 20_export ** ==> Process shell script 10_backup_export_dir.sh save D:/temp/sql to D:/temp/archive chdir D:/temp/archive failed [70G[1A[[1;31mFailed[0;39m] ==> Process shell script 20_export_db.sh directory D:/temp/sql doesn't exist [70G[1A[[1;31mFailed[0;39m] ** ** Finished with directory 20_export ************************************************************** ************************************************************** ** Process directory 30_remove ** ==> Process shell script 30_full_dropdatabase.sh DROP DATABASE marktkauf; DROP DATABASE [70G[1A[[1;32m OK [0;39m] in fullimport mode, skipping /30_remove/40_nofull_dropschemas.sql [70G[1A[[1;33m Skip [0;39m] ** ** Finished with directory 30_remove ************************************************************** ************************************************************** ** Process directory 40_create_database_schema_roles ** ==> Process shell script 10_full_create_roles.sh [70G[1A[[1;32m OK [0;39m] ==> Process shell script 20_full_create_database.sh CREATE DATABASE marktkauf OWNER marktkauf_user TABLESPACE pg_default ENCODING 'UTF8' TEMPLATE template2; CREATE DATABASE [70G[1A[[1;32m OK [0;39m] ==> Process shell script 30_full_create_schema_public.sh [70G[1A[[1;32m OK [0;39m] ==> Process shell script 40_create_schemas.sh [70G[1A[[1;32m OK [0;39m] in login mode without create, skipping /40_create_database_schema_roles/80_full_logincreate_create_logindb_role.sh [70G[1A[[1;33m Skip [0;39m] in login mode without create, skipping /40_create_database_schema_roles/90_full_logincreate_create_database.sh [70G[1A[[1;33m Skip [0;39m] ** ** Finished with directory 40_create_database_schema_roles ************************************************************** ************************************************************** ** Process directory 45_create_tables ** ==> Process SQL script 05_simplerights_create.sql [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 07_userconf_create.sql [70G[1A[[1;32m OK [0;39m] in login mode without create, skipping /45_create_tables/10_full_logincreate_create_tables.sh [70G[1A[[1;33m Skip [0;39m] ==> Process SQL script 10_mapview_create.sql [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 20_pricelist_create.sql [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 25_full_geometry_create.sql addgeometrycolumn --------------------------------------------------------- gis_v1.t_areas_plz5.geom SRID:-1 TYPE:GEOMETRY DIMS:2 (1 Zeile) addgeometrycolumn --------------------------------------------------------- gis_v1.t_areas_plz2.geom SRID:-1 TYPE:GEOMETRY DIMS:2 (1 Zeile) addgeometrycolumn --------------------------------------------------------- gis_v1.t_areas_plz1.geom SRID:-1 TYPE:GEOMETRY DIMS:2 (1 Zeile) addgeometrycolumn ----------------------------------------------------------- gis_v1.t_areas_region.geom SRID:-1 TYPE:GEOMETRY DIMS:2 (1 Zeile) [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 27_full_distareas_create.sql addgeometrycolumn ------------------------------------------------------------------------ gis_project.t_areas_distribution_tmp.geom SRID:-1 TYPE:GEOMETRY DIMS:2 (1 Zeile) addgeometrycolumn -------------------------------------------------------------------- gis_project.t_areas_distribution.geom SRID:-1 TYPE:GEOMETRY DIMS:2 (1 Zeile) [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 30_userdata_create.sql [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 35_full_streets_create.sql addgeometrycolumn ---------------------------------------------------------------- gis_v1.t_streetsegments_ta.geom SRID:-1 TYPE:GEOMETRY DIMS:2 (1 Zeile) [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 38_full_debug_streets_view.sql [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 39_full_create_mapping_tables.sql [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 40_customerstate_create.sql [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 45_userdata_project_create.sql [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 46_gis_project_create.sql [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 50_authdata_create.sql [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 60_customerpricelist_create.sql [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 70_shop_create.sql [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 75_cronping_create.sql [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 75_userdata_stuttgart_create.sql [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 76_businessoffice_create.sql [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 77_competitor_create.sql [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 80_session_create.sql [70G[1A[[1;32m OK [0;39m] ==> Process SQL script 90_blocked_date_create.sql [70G[1A[[1;32m OK [0;39m] ** ** Finished with directory 45_create_tables ************************************************************** Und da möchte ich hin: Import Customer XXXXX Umgebung local ************************************************** ************ ** Process directory 20_export ** ==> Process shell script 10_backup_export_dir.sh save D:/temp/sql to D:/temp/archive chdir D:/temp/archive failed [70G[1A[[1;31mFailed[0;39m] ==> Process shell script 20_export_db.sh directory D:/temp/sql doesn't exist [70G[1A[[1;31mFailed[0;39m] ************************************************************** ** Process directory 50_import ** ==> Process importer 50_distributionarea_marktkauf_warenhaus.ods Call generic Importer for d:\XXXXX Union single geometries by group_id, version and distributor_shortcut -> OK Update x/y coords for unioned geometries -> OK Working on distribution area 'MK20154_1_POST'... Update distribution area domain table -> OK Update branch offices to distribution areas relation -> OK Copy distribution area to final geometry table -> ApplicationException: Datenbank-Fehler: INSERT Statement konnte nicht ausgeführt werden! in C:\Dev\PHPlib\eREAF_PHP_API\src\de\emanagers\reaf\REAF_ExceptionFactory.php on line 178 Call Stack: 0.0005 74144 1. {main}() D:\htdocs\GISWebApplication\bin\CallGenericImporter.php:0 1.1968 12221672 2. REAF_Importer_AbstractController->process() D:\htdocs\GISWebApplication\bin\CallGenericImporter.php:43 1.2619 12469432 3. GISApp_Importer_MixedDistributionAreas->process() C:\Dev\PHPlib\eREAF_PHP_API\src\de\emanagers\reaf\importer\REAF_Importer_AbstractController.php:27 44.6498 16755104 4. REAF_ExceptionFactory::throwApplicationException() D:\htdocs\GISWebApplication\src\de\emanagers\gisapp\importer\GISApp_Importer_MixedDistributionAreas.php:278 [70G[1A[[1;31mFailed[0;39m] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
alligator Geschrieben 25. März 2007 Teilen Geschrieben 25. März 2007 Hi, nu doch nur kurz nen schmutzigen Quickhack in Perl (sorry war am WE etwas busy), aber kann man von der Logik adaptieren. Geht auch auf jeden Fall noch deutlich eleganter, bin da echt nicht mehr so fit drin, aber immerhin tuts (zumindest bei mir)... #!/usr/bin/perl -w use strict; my $rw = open(FILE,"i.txt"); my @Zeilen; if(not defined($rw)) { die "Fehler beim oeffnen der Datei: $!\n"; } while(<FILE>) { push(@Zeilen,$_); } close(FILE); my $c=0; my @auswert; for(@Zeilen) { if (/^\*\*\*/) { push(@auswert,$c); } $c++; } my $laenge = @auswert; my @grep_neu; my @erg_unsort; for(my $i=0;$i<$laenge;$i=$i+2) { my $FLAG=0; for(my $j=$auswert[$i];$j<=$auswert[$i+1];$j++) { if ($Zeilen[$j] =~ /^==>/) { my $z=$j+1; my $tmp_j=0; my $tmp_z=0; until (0) { if ($Zeilen[$z] =~ /Failed.*]$/) { $tmp_j=$j; $tmp_z=$z+1; } if ($Zeilen[$z] =~ /^==>/ || $Zeilen[$z] =~ /^\*\*\*/) { if ($tmp_j != 0 && $tmp_z != 0) { if ($FLAG != 1) { $FLAG = 1; push(@erg_unsort,$auswert[$i],$auswert[$i+1]); } push(@erg_unsort,$tmp_j,$tmp_z); } last; } $z++; } } } my $laenge_unsort = @erg_unsort; if ($laenge_unsort != 0) { print "$Zeilen[$erg_unsort[0]]\n$Zeilen[$erg_unsort[0]+1]\n$Zeilen[$erg_unsort[0]+2]\n"; for(my $co=2;$co<$laenge_unsort;$co=$co+2) { for(my $cox=$erg_unsort[$co];$cox<$erg_unsort[$co+1];$cox++) { print "$Zeilen[$cox]\n"; } } print "$Zeilen[$erg_unsort[1]-2]\n$Zeilen[$erg_unsort[1]-1]\n$Zeilen[$erg_unsort[1]]\n"; } @erg_unsort=(); } ciao, alligator Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
siryasokuhl Geschrieben 26. März 2007 Autor Teilen Geschrieben 26. März 2007 Hey Klasse, ich Danke dir, ich war selbst auch etwas am Überlgen wegen dem awk, hatte aber keine große Eingebung. Jetzt bleibt nur noch zu klären, wo ich die Tüte gummibären hinschicken soll. :bimei Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
alligator Geschrieben 26. März 2007 Teilen Geschrieben 26. März 2007 Hi, tut es also? Freut mich. Ich bin Tierfreund, kann also keine Gummibärchen annehmen und ausserdem hat es mir mal wieder gezeigt, dass ich wieder mehr perlen muss, da ich wirklich aus der Uebung bin - somit ists ne win-win-Situation. ciao, alligator Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
siryasokuhl Geschrieben 26. März 2007 Autor Teilen Geschrieben 26. März 2007 OK Ich schraube trotzdem noch etwas an dem AWK rum. Habe gerade herausgefunden das es in der Bash den Befehl "tac" gibt. tac funktioniert wie cat, nur das das file verkehrt herum ausgegeben wird. Was meine 2 temp files überflüßig macht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.