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

Suositut tekstit