Stranica: 1/1.

[Perl] Parsanje logova

Postano: 15 ožu 2012, 22:49
Postao/la Marijek
Imam jedan problemčić.

Trebam sparsati log u kojemu je meni interesantna linija u formatu:

datum i vrijeme ip_adresa atribut1:vrijednost1/atribut2:vrijednost2/atribut3:vrijednost3 mjJedinica3/../atribut18:vrijednost18 mjJedinica18

U perl skriptu ulaze samo linije iz loga koje su u navedenom formatu, jer ih prije grepam.

Sad mene muči kak izvaditi samo vrijednosti koje su mi potrebne, a to su
- vrijeme (datum je ulazni parametar, pa njega ne trebam vaditi)
- ip_adresa
- samo one vrijednosti koje su u integeru (neke su string)

Pokušao sam pomoću regex napraviti split ( /(\d+:\d\d:\d\d)|(\d+)|\D/ ) i uspijem izvaditi sve vrijednosti koje meni trebaju, ali kad ih stavim na ispis, prikažu se spojeno (npr. 19596639169641447973056042191133). Ako stavim u petlji neki delimiter da mi odvoji vrijednosti (npr. space), nastaje glavni problem. Petlja se okrene 1086 puta, i svaki put se ispiše razmak, makar nema nikakvog printable znaka, pretpostavljam da umjesto onoga što sam maknuo sa regexom stavlja non-printabline znakove.

Zanima me kako mogu izvući čiste vrijednosti i dodijeliti ih nekim varijablama.

Ako stavim u petlju gdje se ispisuje uvjet da baci razmak samo pokraj printabilnih znakova nije neko rješenje, zbog količine iteracija, što može biti problem ako se uzme u obzir to da će se dnevno parsati nekoliko tisuća logova, svaki stotinjak linija.

Da probam to na neki drugi način (awk?) ili se može sa regexom?

I da, koristim perl jer te vrijednosti moram zapisati u bazu, bash mi nije pogodan za to...

Hvala.

Re: [Perl] Parsanje logova

Postano: 16 ožu 2012, 00:34
Postao/la Netko
Neznam perl ali: regex match i backreferences?

Re: [Perl] Parsanje logova

Postano: 16 ožu 2012, 10:08
Postao/la Marijek
Uspio sam, hvala.

Kod: Označi sve

my @params = $line =~ m/(\d+:\d{2}:\d{2})|(\d+\.\d+\.\d+\.\d+)|:(\d+)\s\w*/g)