Komentorivityökaluja: GREP, SED & AWK
1. GREP
Katsotaanpa tässä osiossa, miten GREP:iä voisi käyttää tekstistä tiedon hakemiseen. Ensimmäisessä kolmessa harjoituksessa (1.1. - 1.3.) hyödynnetään testiasiakirja.txt nimistä tiedostoa, jonka sisältö näyttää tältä:
Käytetään myös muitakin tiedostoja, joista mainitaan myöhemmin.
1.1. Henkilötunnus
Haetaan ensin henkilötunnusta. Yleensä henkilötunnukset ovat muotoa DDMMYY-NNNK. Voisimme siis käyttää seuraava komentoa henkilötunnusten etsimiseen:
egrep '[0-9]{6}[-][0-9]{3}[A-Z]{1}' testiasiakirja.txt
Kyseinen komento palautti seuraavan tuloksen:
mika@sci.fi mika.stenberg@laurea.fi 130554-234B
Viivan tilalla voisi myös olla jokin kirjain. Tässä tapauksessa kannattaisi käyttää seuraavanlaista komentoa:
egrep '[0-9]{6}[-]?[A-Z]?[0-9]{3}[A-Z]{1}' testiasiakirja.txt
Yllä oleva komento antoi seuraavan tuloksen:
mika@sci.fi mika.stenberg@laurea.fi 130554-234B
http://regexr.com/foo.html?q=bar 120834A123B
1.2. Sähköpostiosoite
Sähköpostiosoitetta voisi sitten etsiä kaikista nykyisen kansion tiedostoista seuraavalla komennolla:
egrep '[0-9a-z]*[.][0-9a-z]*[@][0-9a-z]*[.][a-z]*' *.
* merkin lopussa voi myös korvata haluamallaan hakemistopolulla.
Tässä komennossa oletamme, että säköpostiosoite sisältää etunimen, sukunimen, @-merkin, domainnimen sekä domain-/maatunnuksen. Pääte palauttaa seuraavan:
grep: go+r: On hakemisto
grep: test: On hakemisto
grep: testfolder: On hakemisto
grep: testfolder2: On hakemisto
grep: testfolder3: On hakemisto
testi2.txt:name.email@email.com
testiasiakirja.txt:foo@demo.net bar.ba@test.co.uk
testiasiakirja.txt:mika@sci.fi mika.stenberg@laurea.fi 130554-234B
1.3. IP-osoite
Seuraavaksi IP-osoite. Itse hain IP-osoitteita seuraavalla komennolla:
egrep '[0-2]?[0-9]?[0-9][.][0-2]?[0-9]?[0-9][.][0-2]?[0-9]?[0-9][.][0-2]?[0-9]?[0-9]' *
Komennon voisi kirjoittaa eri tavalla, mutta tämä toimi hyvin minulla. Tulokseksi sain seuraavan:
grep: go+r: On hakemisto
grep: test: On hakemisto
grep: testfolder: On hakemisto
grep: testfolder2: On hakemisto
grep: testfolder3: On hakemisto
testiasiakirja.txt:255.255.255.0 127.0.0.1
1.4. Sanahaku
Seuraavassa harjoituksessa hyödynsin tätä asiakirjaa. Etsitään ensin siitä sanat "asianajaja", "poliisi" ja "lääkäri" seuraavalla komennolla:
grep -i 'asianajaja\|poliisi\|lääkäri' pg14152.txt
Tästä saadaan seuraava tulos:
Sitten etsitään esiintymät sanoista "Tohtori Jekyll" ja lasketaan samalla montako kertaa ne esiintyvät. Putkitetaan kaksi komentoa tämän tekemiseksi.
grep -o -i 'Tohtori Jekyll' pg14152.txt | wc -l
Pääte palauttaa luvun 12.
2. AWK
Käytetään seuraavaksi AWK työkalua tiedon etsimiseen. Ensimmäisessä harjoituksessa hyödynnämme seuraava tekstitiedostoa, jonka olen nimennyt awktest.txt nimiseksi:
2.1. Etunimi ja puhelinnumero
Haetaan teskstitiedostosta henkilöiden Etunimet ja puhelinnumero. Nämä kaksi osiota erotetaan vielä välilyönnillä ja puhelinnumero pistetään sulkeisiin. Tämä onnistuu seuraavalla komennolla:
awk -F ";" '{print $1," " "("$4")"}' awktest.txt
Tulos on seuraava:
2.2. Summa
Seuraavassa harjoituksessa käytetään seuraava tiedostoa, jossa on mielipidekyselyn tuloksia:
Laskemme kuinka moni on vastannut kyllä ja kuinka moni ei. Tämän voi tehdä komennolla awk -F "," '{x+=$2; y+=$3}END{print x, y}' awkdata.txt. Tulokseksi saamme tämän:
3. SED
Harjoitellaan sitten SED:in käyttöä. Korvataan 1.4. kohdassa ladatusta tiedostosta kaikki sanat "lääkäri" sanalla "puoskari" seuraavalla komennolla:
sed -i s/lääkäri/puoskari/g pg14152.txt
Poistetaan sitten tiedostosta kaikki rivit, joissa esiintyy sana "maailma":
sed -i /maailma/d pg14152.txt
4. Tekstitiedostojen manipulointia
Viimeiseksi katsotaan eri tapoja manipuloida tekstitiedostoja. Aloitetaan niiden yhdistämisestä paste komennolla. Tein tätä varten kolme tiedostoa: nimet.txt jossa on 3 nimeä, puhnro.txt jossa on kolme puhelinnumeroa sekä osoite.txt jossa on 3 osoitetta. Yhdistetään nämä komennolla paste nimet.txt puhnro.txt osoite.txt. Tulos on seuraava:
Jaetaan sitten pg14152.txt tiedosto osiin split komennon avulla. Tässä tiedostossa on 3381 riviä yhteensä. Komennolla split pg14152.txt tiedosto jakaantuu neljään osaan, joissa kaikissa on oletuksena maksimissaan 1000 riviä.
Jos haluamme itse valita, montako riviä jokaisessa osassa on, lisäämme valitsimen -l [luku] komentoon. Tässä esimerkki:
split -l 500 pg14152.txt
Nyt sama tiedosto jakautui 7 osana, joissa jokaisessa on maksimissaan 500 riviä.
Viimeiseksi poistamme tiedostosta kaikki rivit väliltä 200 ja 300. Tämä onnistuu SED komennolla sed -i '200,300d' pg14152.txt.









Kommentit
Lähetä kommentti