Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: 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ä:
count=`grep -o "$i" server.log-x | wc -w`
Mutta miten saada tuo teksti ?
-
Koska minulla on laho pää niin minun täytyy vastata pätkittäin. Marker1 ja Marker2 välisen tekstin tulostus:
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.
-
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ää ?
-
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ä:
#!/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
-
Kiitos. Lisäsin käsittelyn duplikaattien poistoon tyyliin:
perl -ne 'print unless $seen{$_}++' /tmp/delme2 > /tmp/output_final.txt
No tässä lopputulos siistittynä:
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