maveric
Goto Top

Sed Group Inhalt als Variable abspeichern

Wenn es geht bräuchte ich verständlich nicht verkomplizierte Antworten. Ich bin normal Javaentwickler in Ausbildung, nur das ich noch vieles nebenher lerne u.a hier Shell und Perl Programmierung, Administration von Servern und und und. Keep it Simple oder gut erklärt. Ich möchte gerne auch verstehen warum ich was mache.

Moin,

ich habe folgenden Sachverhalt. Ich soll ein Script schreiben, welches ein Logfile Zeilenweise durchsucht und per Regex bestimmte Inhalte filtert, das Ergebnis soll dann in eine Datenbank geschrieben werden. Ich bin schon sehr weit gekommen und habe über den iterativen weg mich einer schon brauchbaren Lösung angenähert.
Ich denke ich zeige zu erst einmal um welche Codestelle es geht..

...Variablendeklaration
...Regex
...Datenbankfunktion

while read line; do
        tmp=$(echo $line | sed -rne "s/$regex/\1|\3|\5|\6|\7|\8/p")  
        ip=$1
        date=$3
        ck=$5
 
if [ -n "$ip" ]  
        then
                insert $ip $date $ck
        fi
done < $file

Mein Problem ist in dem ersten Zeile der while-Schleife, ich habe dort einen sed+Regex+group Audruck der auf jede Zeile des Logiles angewandt wird $line.
Das Ergebnis wird dann in tmp geschrieben. Ok das geht auch alles nur kommt dann im Ergebnis sowas hier bei rum:

842.160.354.444|01/Jan/2009:00:06:22|Zano|Zero|Join|SP

Das ist schon gar nicht schlecht nur wäre es schöner wenn ich die ip, datum usw in extra Variablen hätte. Oben habe ich das auch schon versucht nur ohne Erfolg.
Wenn ihr da eine Idee habt wäre ich sehr dankbar. Ich hoffe ich habe das hier ausreichend gut beschrieben, wenn noch Fragen offen sind bitte stellt sie und
ich versuche sie nach bestem Wissen zu beantworten.

Grüße
Maveric

Content-ID: 180695

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

Ausgedruckt am: 26.11.2024 um 12:11 Uhr

64748
64748 17.02.2012 um 15:35:43 Uhr
Goto Top
Hallo Maveric,

wie sieht denn $regex aus? wenn ich das nicht weiß, kann ich es nicht ausprobieren. Und wie sehen denn die Zeilen in Deinem Logfile aus? kannst Du bitte mal ein Beispiel posten?

M.E. landen ip, datum usw. in verschiedenen Variablen, allerdings brauchst Du vielleicht eine formatierte Ausgabe.

Markus
Maveric
Maveric 17.02.2012 um 16:21:54 Uhr
Goto Top
Ein Auszug kann ich dir leider nicht geben, da ich glaube das das nicht so gut kommt bei meinem Arbeitgeber. Aber ich kann dir weiter Informationen geben die dir sicher helfen.

ip=$(echo $line | sed -rne "s/$regex/\1/p")  
date=$(echo $line | sed -rne "s/$regex/\3/p")  
blub=$(echo $line | sed -rne "s/$regex/\5|\6|\7|\8/p")  

Das würde genau das machen was ich will. Mit dem Nachteil das der Ausdruck insgesamt 3 mal Pro Zeile im Logfile ausgeführt werden würde. Das ist nicht so performant wie ich es brauche. Da das File gut 0,5Millionen Einträge hat.

Der Regex ausdruck an sich bearbeitet Logfiles, die ohne Punkt und Komma durchgeschrieben wurde und extrahiert daraus mehrere Abschnitte(Gruppen). Dabei packe ich auch den Müll an der Stelle wo er auftritt in eine Grupp. Beispiel:

(IP)(MÜLLLLLL)(Datum)(User1)(Zone)(Mehr Müll)(usw)

In der Reihenfolge baut sed dann auch die Gruppen auf 1=IP 2=Müll usw. Sprich so wie oben kann ich also wenn ich den Befehl öfter ausführe die Daten einzeln extrahieren. Ich suche einen weg wie ich es im Anfangspost hatte mit einem Aufruf und der Extraktion der Gruppen im Nachhinein. Unter Java geht das reibungslos.
64748
64748 17.02.2012 um 16:33:41 Uhr
Goto Top
Hallo nochmal,

ich bin kein Experte für sed und glaube, dass ich hier nicht weiter helfen kann.

Auf die Gefahr, dass ich mich hier unbeliebt mache gebe ich Dir einen Tipp. Bei linuxquestions.org in Unterforum "programming" http://www.linuxquestions.org/questions/programming-9/ wirst Du mit großer wahrscheinlichkeit schnell eine Lösung bekommen.

Allerdings solltest Du dort (zusätzlich zu Deinem Code) noch eine Zeile aus dem Logfile (Du kannst sie ja verfremden, so dass man es nicht mehr erkennt) posten.

Viel Erfolg

Markus
Maveric
Maveric 19.09.2012 um 12:51:27 Uhr
Goto Top
Ich habe das Problem schon eine Weile gelöst und daher hier noch kurz ein Nachtrag. Ich habe ein Perl Script geschrieben, was Zeilenweise die Datei einliest, dann einen Regex drüber laufen lässt, der durch Gruppierung es möglich macht, einzelne Teilergebnisse ab zu greifen. Dann werden diese nach den eigenen Wünschen sortiert und in eine DB geschrieben. Hier mal ein kleiner Ausschnitt aus der Script:

open(MYINPUTFILE, "<$file");  
while(<MYINPUTFILE>){

 $line = $_;
 $line =~ m/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)(.*\[)([0-9]+\/\w+\/[0-9]+\:[0-9]+\:[0-9]+\:[0-9]+)(.*)([X][X][=](([Y][0-9]*)(([Z][0-9]*)*)((([P][0-9]*\-[0-9]*)*)*))([X][Y][0-9]*[Z][Z][0-9]*)*)(.*)/g;
 
...mehr Code...

$dbh->do("INSERT INTO Datenbankname (Feld 1,Feld 2,Feld 3,Feld 4,Feld 5,Feld 6,Feld 7,Feld 8) VALUES('$1','$3','$6','$7','$8','$10','$sortMan','$sortProp')");  

}

Die Gruppen ergeben sich aus den Ergebnissen der Klammern z.b. "([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)" hier gleich $1 usw.
Wenn fragen dazu aufkommen gerne per PM, bin ja jetzt Pro ;D.