Ubuntu Suomen keskustelualueet

Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: matsukan - 11.01.15 - klo:20.50

Otsikko: [RATKAISTU] bash käsittely
Kirjoitti: matsukan - 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 ?
Otsikko: Vs: bash käsittely
Kirjoitti: petteriIII - 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.
Otsikko: Vs: bash käsittely
Kirjoitti: matsukan - 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ää ?
Otsikko: Vs: bash käsittely
Kirjoitti: petteriIII - 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
Otsikko: Vs: [RATKAISTU] bash käsittely
Kirjoitti: matsukan - 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