Jump to content

Logfile Auswerten mit AWK

Empfohlene Beiträge

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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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]

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Nimm an der Diskussion teil

Du kannst jetzt hier posten und Dich später registrieren. Wenn Du bereits über eine Konto verfügst, melde Dich jetzt an, um mit Deinem Konto zu posten.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.


Fachinformatiker.de, 2019 SE Internet Services

fidelogo_small.png

if_icon-6-mail-envelope-closed_314900.pnSchicken Sie uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App


Get it on Google Play

Kontakt

Hier werben?
Oder senden Sie eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...

Wichtige Information

Fachinformatiker.de verwendet Cookies. Mehr dazu in unserer Datenschutzerklärung