[Perl] Parsanje logova

C, C++, Java, PHP, Ruby...

Moderator/ica: Moderatori/ce

Pravila foruma
U naslovu teme unutar uglatih zagrada navesti o kojem jeziku je riječ. Primjer: [Java]
Odgovori
Marijek
Postovi: 253
Pridružen/a: 13 srp 2008, 20:08
Spol: M
OS: A
Lokacija: Kž - Zg

[Perl] Parsanje logova

Post 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.
per aspera ad astra iliti kroz gužvu do šanka...
In a world without walls and fences who needs Windows and Gates?
Netko
Postovi: 290
Pridružen/a: 13 ožu 2012, 20:14

Re: [Perl] Parsanje logova

Post Postao/la Netko »

Neznam perl ali: regex match i backreferences?
Marijek
Postovi: 253
Pridružen/a: 13 srp 2008, 20:08
Spol: M
OS: A
Lokacija: Kž - Zg

Re: [Perl] Parsanje logova

Post 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)
per aspera ad astra iliti kroz gužvu do šanka...
In a world without walls and fences who needs Windows and Gates?
Odgovori