tommhii
Goto Top

Mit einen Shell script bestimmte Werte aus einer Datei auslesen

Hallo, ich möchte aus einer log Datei bestimmte Wert mit Hilfe eines Linux Scriptes auslesen, die ich dann in eine andere Datei schreibe, von wo sie weiter verarbeitet werden soll.

Hallo ich habe ein Prog. was täglich läuft und mir eine log. Datei schreibt. In dieser Log Datei stehen unter anderen einige Werte die ich weiterverarbeiten will.
Die folgenden Zeilen befinden sich in der log Datei und nur die will ich auslesen. Ich will die verbrauchte Zeit der Aufrufe auswerten.


10759' 'OTHERS '-Aufrufe benötigten '0:572.921.999' Sek.
10273' 'SELECT '-Aufrufe benötigten '8:787.561.000' Sek.
2' 'EXECUTE '-Aufrufe benötigten '3:993.116.999' Sek.
0' 'UPDATE '-Aufrufe benötigten '0:000.000.000' Sek.
0' 'DELETE '-Aufrufe benötigten '0:000.000.000' Sek.
0' 'INSERT '-Aufrufe benötigten '0:000.000.000' Sek.
153248' 'READ '-Aufrufe benötigten '7:818.841.000' Sek.
10907' 'CLOSESTMT '-Aufrufe benötigten '0:400.665.999' Sek.
233' 'TRANSACT '-Aufrufe benötigten '0:013.992.999' Sek.
Größter Zeitverbrauch bei einem DB-Aufruf war: '60:278.984.000'.
Datenbank geschlossen, Zeitverbrauch komplett: '476:498.166.000' Sekunden.

Nur diese Zeilen brauche ich nur aus der Logdatei.
Kann mir jemand vielleicht einen Lösungsansatz geben

Gruß Tommhii

Content-Key: 178998

Url: https://administrator.de/contentid/178998

Ausgedruckt am: 28.03.2024 um 18:03 Uhr

Mitglied: LumenAlbum
LumenAlbum 17.01.2012 um 00:13:01 Uhr
Goto Top
Hallo Tommhii,

wie meinst du das genau?
Möchtest du aus den obigen Zeilen die Sekunden extrahieren?

Sowas ließe sich dann in batch mit "tokens" und "delims" lösen: z.B.

 for /f "tokens=5 delims='" %%i in (temp.log) do @ECHO %%i   

Das würde bei deinen geposteten Zeilen dann folgende Ausgabe liefern:

0:572.921.999
8:787.561.000
3:993.116.999
0:000.000.000
0:000.000.000
0:000.000.000
7:818.841.000
0:400.665.999
0:013.992.999

Für die letzten beiden Zeilen (davon ausgehend das der Aufbau immer gleich ist) müsste man dies natürlich entsprechend anpassen.

Oder willst du was ganz anderes und möchtest innerhalb einer größeren log-Datei die Zeilen herausfiltern, die oben genannte Angaben enthalten?

Gruß
LumenAlbum
Mitglied: tommhii
tommhii 17.01.2012 um 11:28:58 Uhr
Goto Top
Danke dir für deine schnelle Antwort.


ich wollte davor noch die Begriffe stehen haben z.B.
10759 OTHERS 0:572.921.999 sek
10273 SELECT 8:787.561.000 sek
.
.
.
usw. und den Output in eine neue Datei schreiben. Wie gesagt da die log Datei auf einer Linux maschine entsteht muss dieses Script auch da laufen.


Gruß tommhii
Mitglied: LumenAlbum
LumenAlbum 18.01.2012 um 00:14:17 Uhr
Goto Top
Sorry, hatte den Text in der blauen Überschrift (wo du erwähnst das es um Linux geht) übersehen.

Vielleicht findet sich hier noch jemand der sich mit der Linux bash auskennt - ich habe fast nur mit Windows zu tun.

Möglich wäre natürlich auch noch "Java" als Programmiersprache, die auch unter Linux benutzt werden kann, wenn dem nichts entgegensteht (kann ja sein, dass es auf jeden Fall ein Shell Skript sein soll)

Gruß
LumenAlbum
Mitglied: tommhii
tommhii 18.01.2012 um 07:55:43 Uhr
Goto Top
Kein Problem, ich danke dir trotzdem erstmal dafür das du mir einen schnellen Lösungsansatz gegeben hast .
Aber vielleicht findet sich ja hier noch jemand der eine Idee ha wie man dies umsetzen kann.


Gruß Tommhii
Mitglied: LumenAlbum
LumenAlbum 19.01.2012 um 23:45:06 Uhr
Goto Top
Wäre Java denn eine Option? Oder soll es unbedingt die Linux Shell sein?

Mit deinem log-Posting und unter der Bedingung, dass die log-Datei immer genau nach diesem Schema aufgebaut ist und die Anzahl der Zeilen gleich ist, wäre eine Möglichkeit in Java:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class StringParse
{

	public static void main(String args)
	{
		
		try
		{
			String input = "";  
			String parts;
			BufferedReader reader = new BufferedReader(new FileReader("test.txt"));  
			
			for (int i = 0; i < 9; i++)
			{
				input = reader.readLine();
				parts = input.split("'");  
				System.out.println(parts + " " + parts[2] + parts[4] + " Sek.");  
			}
			
			for (int i = 0; i < 2; i++)
			{
				input = reader.readLine();
				parts = input.split("'");  
				System.out.println(parts.substring(0, 21) + " " + parts[1] + " Sek.");  
			}
			
		} catch (FileNotFoundException e)
		{
			e.printStackTrace();
			
		} catch (IOException e)
		{
			e.printStackTrace();
		}
		
	}
}

Output:

10759 OTHERS 0:572.921.999 Sek.
10273 SELECT 8:787.561.000 Sek.
2 EXECUTE 3:993.116.999 Sek.
0 UPDATE 0:000.000.000 Sek.
0 DELETE 0:000.000.000 Sek.
0 INSERT 0:000.000.000 Sek.
153248 READ 7:818.841.000 Sek.
10907 CLOSESTMT 0:400.665.999 Sek.
233 TRANSACT 0:013.992.999 Sek.
Größter Zeitverbrauch 60:278.984.000 Sek.
Datenbank geschlossen 476:498.166.000 Sek.

Allerdings weiß ich nicht ob das für dich in Frage kommt.

Liebe Grüße
LumenAlbum
Mitglied: tommhii
tommhii 20.01.2012 um 14:13:08 Uhr
Goto Top
hallo Lumen,
danke dir erstmal, die Log Datei enthält vorne weg und auch nach dem Ausschnitt, den ich hier gepostet habe noch einige Zeilen die ich nicht gebrauchen kann. Diese Zeilen sind nicht immer gleich, es können mal 20 zeilen davor kommen oder auch mehr, genauso ist es nach dem Ausschnitt den ich nur brauch. Ich will sagen die zeilen die ich auslesen will stehen zwar immer zusammen in einen Block wie ich es gepostet habe, aber nie an der selben Stelle in der Log datei.

Ich habe mir überlegt diese Log Datei auf eine Windows maschine zu transferieren und ein script als Dos Batch zu erstellen.
Java wollte ich eigentlich nicht nutzen.

Aber trotzdem erst mal vielen Dank.

Ich bin natürlich für jeden Tip Dankbar.

Grüße Tommhi