tietynlaisten tietojen parsimeinen pitkästä tekstistä

perl

eli miten saan sähköpostin header tiedoista talteen lähettäjän IP:n ja lähetysajan.

haettava tieto on header tiedoissa tässä muodossa :

from jotain domainnimi [192.168.IP.IP] by mail.server with SMTP id joku ID for jotain; Thu, 13 Jan 2005 12:20:49 -0500

eli tuo on siellä kaiken muun roskan joukossa, ja siitä pitäisi saada talteen IP-osoite ja päivämäärä.

tiedoissahan on useita IP-osoitteita, mutta haluan sieltä talteen nimenomaan tietystä osoiteavaruudesta tulevat. eli IP:n kaksi ensimmäistä numeroa ovat aina samat.

niin ja käytössä MDK 9.2 kone ja Perl jos noista nyt on jotain apua.

10

968

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • *BSD

      Siis lokien parsintaan on olemassa jos jonkinlaista härpäkkää.

      Sun tapauksessa varmaan grep (ja sed) on ihan riittävä työkalu (ja mikähän helvetti on MDK 9.2? Joku mandrake linuks vai?).

      Oletetaan, että halutaan entryt, jotka on tullut osoitteista 192.168.0/16

      mun liinuks bashi $ cat loki.log | egrep '\[192\.168\.' | sed -n 's/^from .*\[\([^]]*\)\].*;\(.*\)$/\1 \2/p'

      Tossa edellä tulostaa ip date -pareja. Ton voi kyllä tehdä muillakin tavoilla.

      • Aii, silmiäni sattuu moinen putkitus ja jälleen kerran klassinen "useless use of cat".

        Perlillä homman saisi tehtyä varmasti yksinkertaisemminkin, jotenkin tähän tyyliin (testaamaton):

        ($loppuosa) ~= /^from .*? \[192.168.(\d{1,3}\.\d{1,3})\]/

        Jos ohjelma on vähänkään pidempi, niin se kannattaa tehdä perlillä. Grep/sed tuntuu toimivan eri alustoilla vähän vaihtelevasti.


      • perl
        Mik26 kirjoitti:

        Aii, silmiäni sattuu moinen putkitus ja jälleen kerran klassinen "useless use of cat".

        Perlillä homman saisi tehtyä varmasti yksinkertaisemminkin, jotenkin tähän tyyliin (testaamaton):

        ($loppuosa) ~= /^from .*? \[192.168.(\d{1,3}\.\d{1,3})\]/

        Jos ohjelma on vähänkään pidempi, niin se kannattaa tehdä perlillä. Grep/sed tuntuu toimivan eri alustoilla vähän vaihtelevasti.

        eli viestit luetaan postilaatikosta mysql kantaan, josta sitten pitäisi saada viestien sisällöstä ainoastaan nuo em. tiedot talteen.

        viestit ovat välillä pitkiä, ja niitä on todella paljon. grepillä jo koitin, ja se ei toimi riittävän luotettavasti.

        viestit ovat sisällöltään kokonaisia sähköpostin headertietoja, joten ne ovat joskus aika pitkiäkin.
        kuitenkin ne aina noudattavat tuota em kaavaa, jonka perusteella ip ja päivämäärä on varmaan jotenkin mahdolista talteen saada.


      • *BSD
        Mik26 kirjoitti:

        Aii, silmiäni sattuu moinen putkitus ja jälleen kerran klassinen "useless use of cat".

        Perlillä homman saisi tehtyä varmasti yksinkertaisemminkin, jotenkin tähän tyyliin (testaamaton):

        ($loppuosa) ~= /^from .*? \[192.168.(\d{1,3}\.\d{1,3})\]/

        Jos ohjelma on vähänkään pidempi, niin se kannattaa tehdä perlillä. Grep/sed tuntuu toimivan eri alustoilla vähän vaihtelevasti.

        Ei ole sellaista kun "useless use of cat". Syystä, että se on *huomattavasti* helpompi ymmärtää kun streamien uudelleenohjaus, varsinkin aloittelijalta:

        cat x.y | jotain
        tai
        jotain < x.y

        Toisekseen sun perli ei tee mitä on tarkoitus. Eli päivämäärät vielä puuttuu. Sitten kun lisäät ton ja loopin ympärille (voi tietenkin tehdä komentoriviltä myös) on lopputulos suhteellisen samanlainen kun grep & sed ratkaisu.

        Lisäksi grep/sed toimii kaikilla *NIX-alustoilla kun taas esim. perl ei ole vakiona mukana läheskään kaikissa.

        Samaa mieltä olen tossa, että jos ohjelma on vähänkään pidempi se kannattaa tietenkin tehdä muuten kun käyttämällä komentoriviä.


      • *BSD
        perl kirjoitti:

        eli viestit luetaan postilaatikosta mysql kantaan, josta sitten pitäisi saada viestien sisällöstä ainoastaan nuo em. tiedot talteen.

        viestit ovat välillä pitkiä, ja niitä on todella paljon. grepillä jo koitin, ja se ei toimi riittävän luotettavasti.

        viestit ovat sisällöltään kokonaisia sähköpostin headertietoja, joten ne ovat joskus aika pitkiäkin.
        kuitenkin ne aina noudattavat tuota em kaavaa, jonka perusteella ip ja päivämäärä on varmaan jotenkin mahdolista talteen saada.

        Grep toimii riittävän luotetavasti. Syy on poikkeuksetta aina käyttäjässä. Jos tuntuu siltä, ettei sun skripti toimi, kannattaa tutustua grep:n manuskaan (man grep) ja varsinkin grep:n regexeihin (noita voi sitten hyödyntää muuallakin kun ovat aika samanlaisia grep/awk/sed/perl -rintamalla).

        grep, sed ja awk ovat juuri luotu tuollaiseen tekstin parsintaan. Niillä *varmasti* pystyt tekemään tarvittavan. Lisäksi jos teet tosta skriptin, se jopa toimii muillakin alustoilla kun liinuksissa.


      • *BSD kirjoitti:

        Ei ole sellaista kun "useless use of cat". Syystä, että se on *huomattavasti* helpompi ymmärtää kun streamien uudelleenohjaus, varsinkin aloittelijalta:

        cat x.y | jotain
        tai
        jotain < x.y

        Toisekseen sun perli ei tee mitä on tarkoitus. Eli päivämäärät vielä puuttuu. Sitten kun lisäät ton ja loopin ympärille (voi tietenkin tehdä komentoriviltä myös) on lopputulos suhteellisen samanlainen kun grep & sed ratkaisu.

        Lisäksi grep/sed toimii kaikilla *NIX-alustoilla kun taas esim. perl ei ole vakiona mukana läheskään kaikissa.

        Samaa mieltä olen tossa, että jos ohjelma on vähänkään pidempi se kannattaa tietenkin tehdä muuten kun käyttämällä komentoriviä.

        Tuolla uselessilla tarkoitin tilannetta, jossa tehdään "cat file | grep jotain", kun grepille voi antaa tiedoston suoraankin "grep jotain file". En siis tarkoittanut uudelleenohjausta


      • *BSD
        Mik26 kirjoitti:

        Tuolla uselessilla tarkoitin tilannetta, jossa tehdään "cat file | grep jotain", kun grepille voi antaa tiedoston suoraankin "grep jotain file". En siis tarkoittanut uudelleenohjausta

        Heh,


    • perl

      kiitokset Mik26, toi sun skripti ei suoraan toiminut, mutta tuosta sain sopivasti muuttamalla kaiken kasaan.

      seuraavalla parsii oikein :

      =~ m/.*?from(\d \.\d \.\d \.\d ).*?SMTP.*?;.*?\,.*?(\d )\s{1}(\w{3})\s{1}(\d{4}).*?(\d{2}:\d{2}:\d{2}).*?(\W{1}\d{4})/

      • Optimointina mainittakoon, että \s{1} on sama kuin \s. Tuloksena on astetta siistimpi versio.

        Eikö tuohon ensimmäisen fromin jälkeen ennen sulkua tule tyhjä ? Rivin alun voisi matchata vielä ^:lla tuon .*?:n sijaan. Muuten esim. rivi "asdf from .." voisi mennä läpi.


      • perl
        Mik26 kirjoitti:

        Optimointina mainittakoon, että \s{1} on sama kuin \s. Tuloksena on astetta siistimpi versio.

        Eikö tuohon ensimmäisen fromin jälkeen ennen sulkua tule tyhjä ? Rivin alun voisi matchata vielä ^:lla tuon .*?:n sijaan. Muuten esim. rivi "asdf from .." voisi mennä läpi.

        juu tyhjä tulee siihen, ei ole copy&paste, joten jokunen kirjotusvirhe siellä voi olla.

        kyllä siinä tuo .*? saa olla, jotta menee läpi myös noi (adfsgggg from...), kun noissa headereissa on kaikenlaista.

        kiitokset vielä kerran.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Marin sitä, Marin tätä, yhyy yhyy, persut jaksaa vollottaa

      On nuo persut kyllä surkeaa porukkaa. Edelleen itkevät jonkun Marinin perään, vaikka itse ovat tuhonneet Suomen kansan t
      Maailman menoa
      133
      3841
    2. Ikävä sinua..

      Kauan on aikaa kulunut ja asioita tapahtunut. Mutta sinä M-ies olet edelleen vain mielessäni. En tiedä loinko sinusta va
      Ikävä
      20
      1793
    3. Riikka Purra: "Kokoomus haluaa leikata pienituloisten etuuksista - Se ei meille käy"

      Näin vakuutti persujen Purra edellisten eduskunta vaalien alla,. https://www.ku.fi/artikkeli/4910942-kun-uudessa-videos
      Maailman menoa
      34
      1664
    4. Riikka Purra sanoo, että sietokykyni vittumaisiin ihmisiin alkaa olla lopussa.

      https://www.iltalehti.fi/politiikka/a/be8f784d-fa24-44d6-b59a-b9b83b629b28 Riikka Purra sanoo medialle suorat sanat vitt
      Maailman menoa
      318
      1495
    5. Muistattekos kuinka persujen Salainen Akentti kävi Putinin leirillä

      Hakemassa jamesbondimaista vakoiluoppia paikan päällä Venäjällä? Siitä ei edes Suomea suojeleva viranomainen saanut puhu
      Maailman menoa
      20
      1423
    6. Lindtmanin pääministeriys lähenee päivä päivältä

      Suomen kansan kissanpäivät alkavat siitä hetkestä, kun presidentti Stubb on tehnyt nimityksen. Ainoastaan ylin tulodesi
      Maailman menoa
      42
      1356
    7. Kapiainen siviiliesimies, Herra suuri Herra

      Sotilaana kyvytön, johtajana munaton ja kotona tossun alla. Se on upseerin uran tuen pää, seinään ajo. Mutta aina löytyy
      Sodankylä
      77
      1019
    8. Tuntuuko sinusta mies

      että olet jossain, mutta sydämessäsi haluat olla muualla. Suunnittelet kaikkea kivaa ja olet innolla mukana, mutta silti
      Ikävä
      16
      1014
    9. Väärä pää tutustumiseen

      Mikä ihme on, että miehet haluavat ensimmäisenä sänkyyn? Onko nykyään niin helppo saada nainen peittojensa alle.. tai pä
      Ikävä
      131
      983
    10. Oon kyllä välillä ollut susta

      Nainen huolissani, en oo niin sydämetön mitä tunnut ajattelevan
      Ikävä
      75
      906
    Aihe