Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Sed Group Inhalt als Variable abspeichern

Frage Linux

Mitglied: Maveric

Maveric (Level 1) - Jetzt verbinden

17.02.2012 um 14:25 Uhr, 3304 Aufrufe, 4 Kommentare

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

01.
 
02.
while read line; do 
03.
        tmp=$(echo $line | sed -rne "s/$regex/\1|\3|\5|\6|\7|\8/p") 
04.
        ip=$1 
05.
        date=$3 
06.
        ck=$5 
07.
  
08.
if [ -n "$ip" ] 
09.
        then 
10.
                insert $ip $date $ck 
11.
        fi 
12.
done < $file 
13.
 
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
Mitglied: hmarkus
17.02.2012 um 15:35 Uhr
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
Bitte warten ..
Mitglied: Maveric
17.02.2012 um 16:21 Uhr
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.

01.
ip=$(echo $line | sed -rne "s/$regex/\1/p") 
02.
date=$(echo $line | sed -rne "s/$regex/\3/p") 
03.
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.
Bitte warten ..
Mitglied: hmarkus
17.02.2012 um 16:33 Uhr
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
Bitte warten ..
Mitglied: Maveric
19.09.2012 um 12:51 Uhr
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:

01.
open(MYINPUTFILE, "<$file"); 
02.
while(<MYINPUTFILE>){ 
03.
 
04.
 $line = $_; 
05.
 $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; 
06.
  
07.
...mehr Code... 
08.
 
09.
$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')"); 
10.
 
11.
}
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.
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
gelöst Variable auf Inhalt prüfen (1)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Exchange Server
Inhalt von Postfächern in Exchange löschen (9)

Frage von m.reeger zum Thema Exchange Server ...

Batch & Shell
gelöst Selected Gridview Value in Variable schreiben (4)

Frage von reissaus73 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (17)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

DSL, VDSL
DSL-Signal bewerten (14)

Frage von SarekHL zum Thema DSL, VDSL ...