Kirjoittaja Aihe: [RATKAISTU] bash käsittely  (Luettu 2608 kertaa)

matsukan

  • Käyttäjä
  • Viestejä: 2152
    • Profiili
[RATKAISTU] bash käsittely
« : 11.01.15 - klo:20.50 »
Eli oliisi tarkoitus tehdä bash skripti joka käy tiedostoa jossa on erityyppisiä loki rivejä. Riveistä joissa on markeri1 pitäisi saada markeri1 ja markeri2 välinen tekstiosuus talteen ja laskettua näiden eri tekstiosuuksien määrä.  :P

määrän voisi laskea vaikka tällä:
Koodia: [Valitse]
count=`grep -o "$i" server.log-x | wc -w`

Mutta miten saada tuo teksti ?
« Viimeksi muokattu: 12.01.15 - klo:23.38 kirjoittanut syrtek66 »
Pohjois-pohjanmaa
-- motto:  backupin tarve huomataan aina liian myöhään

petteriIII

  • Käyttäjä
  • Viestejä: 693
    • Profiili
Vs: bash käsittely
« Vastaus #1 : 11.01.15 - klo:21.15 »
Koska minulla on laho pää niin minun täytyy vastata pätkittäin. Marker1 ja Marker2 välisen tekstin tulostus:
Koodia: [Valitse]
echo $rivi | grep -Po '(?<=Marker1).*(?=Marker2)'  # tulostaa tekstin joka on hakuavaimien välissä

- mikäli kumpiakin markkereita ei löydy niin tulostetaan tyhjää. Mutta kokeile kosken ole varma että ymmärsin oikein.

matsukan

  • Käyttäjä
  • Viestejä: 2152
    • Profiili
Vs: bash käsittely
« Vastaus #2 : 11.01.15 - klo:23.00 »

so be it. Eli onnistui mutta ...

määrän laskenta ei onnistu koska grep löytää samoja sanoja eri riveistä.  :P

pitänee jatkaa tutkimuksia, ei bash:ssa onnistuisi liittää taulukkoon myös esiintymismäärää ?
Pohjois-pohjanmaa
-- motto:  backupin tarve huomataan aina liian myöhään

petteriIII

  • Käyttäjä
  • Viestejä: 693
    • Profiili
Vs: bash käsittely
« Vastaus #3 : 12.01.15 - klo:02.49 »
Nyt olen taas kertaalleen käsittänyt jotakin väärin mikä on minun kanssani ihan normaalia. Mutta korjasin käsitystäni ja toivottavasti nyt alkaa tulla hommaan järkeä:
Koodia: [Valitse]
#!/bin/bash
echo $teksti | grep -Po '(?<=Marker1).*(?=Marker2)' > /tmp/delme # tulostaa jokaisella tekstirivillä markkerien välisen tekstin. Rivillä täytyy olla kumpikin markkeri tai mitään ei tulostu.

while read line
do
count=`grep -o "$line" /tmp/delme | wc -w`; echo $count # tämä käsittelee tulosrivit yksi kerrallaan ja tulostaa sillä olevien sanojen määrän
done < /tmp/delme
rm /tmp/delme
« Viimeksi muokattu: 12.01.15 - klo:09.36 kirjoittanut petteriIII »

matsukan

  • Käyttäjä
  • Viestejä: 2152
    • Profiili
Vs: [RATKAISTU] bash käsittely
« Vastaus #4 : 12.01.15 - klo:23.44 »

Kiitos. Lisäsin käsittelyn duplikaattien poistoon tyyliin:

Lainaus
perl -ne 'print unless $seen{$_}++' /tmp/delme2 > /tmp/output_final.txt


No tässä lopputulos siistittynä:

Lainaus
echo $teksti | grep -Po '(?<=Marker1:).*(?=Marker2)' input.log > /tmp/delme

while read line
do
  count=`grep -o "$line" /tmp/delme | wc -l`; # echo $line $count
  printf "$line," >> /tmp/delme2
  printf "$count,\n" >> /tmp/delme2
done < /tmp/delme
rm /tmp/delme
perl -ne 'print unless $seen{$_}++' /tmp/delme2 > /tmp/output.txt
rm /tmp/delme2
./mail.sh /tmp/output.txt "some_info"
rm /tmp/output.txt

Pohjois-pohjanmaa
-- motto:  backupin tarve huomataan aina liian myöhään