**grep** (search **g**lobally for a **r**egular **e**xpression and **p**rint) on Unix-käyttöjärjestelmän komentoriviohjelma, joka etsii säännöllisillä lausekkeilla määriteltyjä merkkijonoja tiedostoista. Ohjelman nimi on peräisin ed-tekstieditorin komennosta *g/re/p*. Ohjelman on kehittänyt Ken Thompson. Ohjelma vaikutti myös sed-rivieditorin kehitykseen.

Tietokoneslangissa *greppaus* tai *greppaaminen* tarkoittaa yleensä mitä tahansa merkkijonojen etsimistä.

Historia
--------

Ohjelma on peräisin alkuperäisestä Unixista, jonka piti toimia PDP-11 -tietokoneella pienellä muistimäärällä. Ken Thompson teki ed-ohjelman tekstin muokkaamiseen primitiivisillä näyttölaitteilla ilman kursoria. ed salli säännöllisten lausekkeiden avulla, jossa 'g' tarkoitti hakua, 'p' tulostamista ja 're' lauseketta ja tämä esitettiin muodossa: `g/re/p`. Lee McMahon halusi ohjelmaa, jolla pystyi hakemaan tiedostosta merkkijonoja ja ongelmana oli, että tiedosto oli tuolloin liian suuri tietokoneen muistimäärälle jotta sitä olisi voitu avata editorissa. Tämän johdosta Thompson teki ohjelman grep.
Alfred V. Aho ja Margaret J. Corasick kehittivät Aho-Corasick -algoritmin merkkijonojen hakemiseen, joka toteutettiin fgrep-versioon ohjelmasta.

Toteutuksia
-----------

grep-ohjelmasta on useita toteutuksia:

* ensimmäisen toteuttivat Ken Thompson ja Dennis Ritchie
* myöhemmin Lee E. McMahon toteutti uuden version ohjelmasta
* Alfred Aho toteutti egrep- ja fgrep-versiot ohjelmasta
* BSD-projektin versio, jonka alkuperäiset kehittäjät olivat James Howard ja Dag-Erling Coïdan Smørgrav
* GNU-projektin tekemä versio, jonka alkuperäinen kehittäjä on Mike Haertel

GNU grep käyttää Boyer-Moore -algoritmia, joka ensin hakee haettavan merkkijonon ensimmäisen merkin ja hakutaulun avulla päättelee miten pitkälle eteenpäin se voi hypätä jos merkki ei täsmää haettuun.

Esimerkkejä
-----------

Komentoriviputkessa
Yleinen tapa on liittää ohjelman käyttö komentoriviputkeen:

```
 $ ps | grep bash

```

Tämä tapaus esittää `ps` ohjelman antamasta prosessilistauksesta rivit, joilla esiintyy sana `bash`.

Tyhjät rivit
Etsii tiedostosta `#tiedosto` kaikki tyhjät rivit ja tulostaa ne kaikki oletustulostusvirtaan:

```
 $ grep -e '^$' #tiedosto

```

Katso myös
----------

* sed

Lähteet
-------

1. 1 2 3 4  David Cassel: Brian Kernighan Remembers the Origins of ‘grep’  22.7.2018. The Newstack. Viitattu 7.8.2018.
2. ↑  CHAPTER 9 *columbia.edu*. Viitattu 6.9.2019. (englanniksi)
3. ↑  Alfred V. Aho & Margaret J. Corasick: Efficient string matching: an aid to bibliographic search *dl.acm.org*.  kesäkuu 1975. doi:10.1145/360825.360855.  Viitattu 26.4.2023. (englanniksi)
4. ↑  Bertrand Meyer: Incremental String Matching (PDF) *se.inf.ethz.ch*.  1985. Viitattu 26.4.2023. (englanniksi)
5. ↑  fgrep *ss64.com*. Viitattu 26.4.2023. (englanniksi)
6. 1 2 3 4  M. Douglas McIlroy: A Research UNIX Reader: Annotated Excerpts from the Programmer’s Manual, 1971-1986 (PDF) *cs.dartmouth.edu*. Viitattu 6.9.2019. (englanniksi)
7. 1 2 3  Mike Haertel: why GNU grep is fast *lists.freebsd.org*.  21.8.2010. Viitattu 26.4.2023. (englanniksi)
8. ↑  index : src *cgit.freebsd.org*. Viitattu 26.4.2023. (englanniksi)
9. ↑  Robert S. Boyer & J. Strother Moore: A fast string searching algorithm *dl.acm.org*.  lokakuu 1977. doi:10.1145/359842.359859.   (englanniksi)

Kirjallisuutta
--------------

* Bambenek, John & Klus, Agnieszka: *grep Pocket Reference*. O'Reilly, 2009. ISBN 978-0-596-15360-1.

Aiheesta muualla
----------------

* GNU Grep 3.0 (englanniksi)
* User Commands (englanniksi)