[Perl] Parsanje logova
Postano: 15 ožu 2012, 22:49
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.
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.