A grep története – a 40 éves Unix parancs

Jelen cikk a 40 éves a grep parancs című hírben hivatkozott The history of grep című cikk fordítása.

A grep egy Unix parancssori eszköz (bár a legtöbb Unix eszköz parancssori), ami a bemeneti fájlokban keres megadott mintákat, majd kiírja azokat a sorokat, amelyek megfelelnek a mintának. Ha ezt olvasod, valószínűleg nem idegen számodra a grep.

A grep parancsot Ken Thompson írta. Igen, az a Ken Thompson, aki a Unixot is. A grep először a Unix 4. verziójában jelent meg és a maihoz képest korlátozott funkcionalitással. A Unix 6-ban ez volt a grep manuálja (kézikönyve):

NÉV
grep – mintához illeszkedő fájlok keresése

ÁTTEKINTÉS
grep [ -v ] [ -b ] [ -c ] [ -n ] expression [ file ] …

LEÍRÁS
A grep a bemeneti fájlokban (alapértelmezetten a standard bemenet) keres a reguláris kifejezésnek megfelelő sorokat. Alapértelmezés szerint minden megtalált sor megjelenik a standard kimeneten. A -v kapcsoló használatával az illeszkedő sorok kivételével minden sort kiír. A -c kapcsoló használatával csupán az illeszkedő sorok száma jelenik meg. Az -n kapcsoló használatával minden illeszkedő sornál feltüntetésre kerül, hogy a bemeneti állományban hányadik sorban van. A -b kapcsoló használatával minden sornál fel van tüntetve a blokk szám, ahol elhelyezkedik. Ez néha hasznos, ha lemez blokk szám alapján szeretnénk keresni.

Minden esetben, amikor több bemeneti fájl van, a fájl neve is feltüntetésre kerül.

A reguláris kifejezések teljes leírásáért nézd meg az ed-et (I). A $ * [ ^ | ( ) és \ karakterek használata különös óvatosságot igényel, mivel a Shell számára is jelentéssel bírnak. Általában az egész kifejezést idézőjelek közé szükséges tenni.

LÁSD MÉG
ed (I), sh (I)

HIBÁK
A sorok legfeljebb 256 karakteresek lehetnek, a hosszabb szavak csonkolásra kerülnek.

A rossz születésnap

Talán azért, mert a Unix 4-es grep kézikönyv 1973. március 3-ai, sok interneten fellelhető cikk, de még a Wikipédia is, amíg nem szerkesztettem, ezt a napot tekintette a grep születésnapjának.

A Unix 4 grep kézikönyv idevágó sorai:

.th GREP I 3/3/73
.sh NAME
grep \*- mintához illeszkedő fájlok keresése

Mivel a Wikipédián nem volt forrás a keletkezés dátumához és a Unix 4-es grep kézikönyvet nem találtam meg a Google-n, a Reddit-hez fordultam és magának Ken Thompsonnak írtam egy e-mailt, nem bíztam benne túlzottan, hogy választ is kapok. Ám Redditen valaki válaszolt egy linkkel a Unix 4 kézikönyvre. És másnap ezt az e-mailt találtam a bejövő leveleim között:

Feladó: Ken Thompson <ken kukac google pont com>
Dátum: 2014-01-12 20:26, vasárnap
Tárgy: Re: a grep születésnapja
Címzett: benjamin <benjaminrtz kukac gmail pont com>

Nem emlékszem, mit jelent a dátum a .th makróban. Talán a kézikönyv utolsó módosításának dátuma, nem a parancsé. Nem emlékszem, hogy valaha is feljegyeztük volna, mikor keletkeztek a parancsok. Általában olyasmit tudtunk mondani, hogy „először a kézikönyv x-edik verzióban jelent meg”.

Mindig nagyon figyeltünk, hogy ne pakoljunk szemetet a segédprogramok könyvtáraiba. A grep egy ideig a személyes parancsom volt, mielőtt publikáltam.
Ez volt a hosszú válasz. A rövid az, hogy „valamikor a 4. verzió előtt”.

ken

2014-01-11. 13:14 keltezéssel benjamin írta:

Ken,

Meg tudnád erősíteni a grep születésnapját, kérlek?

A grep-et Ken Thompson készítette egy önálló alkalmazásként a reguláris kifejezés elemző alapján, amit a szintén saját maga írt ed-hez készített. [3] Az ed-ben a g/re/p parancs az összes olyan sort, amit egy előre definiált mintára illik. [4] [5] A grep hivatalos keletkezési dátumának 1973. március 3. van megadva a Unix 4 kézikönyvében. [link szükséges]
http://en.wikipedia.org/wiki/Grep


benjamin rualthanzauva

Elragadtatva futottam a feleségemhez és megmutattam neki az e-mailt, bár nagyon kicsi esélye volt, hogy megérti az izgatottságomat. Köszönöm Ken és /r/linux.

A grep feltalálása, és ennek jelentősége

Egy McIlroy nevű fickó azt állította, hogy a grep számára lett elkészítve. Legalábbis mendemondák szerint. Aztán vagy elhisszük vagy nem.

„Egyik délután megkérdeztem Ken Thompsont, hogy ki tudná-e emeli a reguláris kifejezés értelmezőt a szerkesztőből és készíteni belőle egy különálló programot. Azt mondta, igen. Másnap találtam egy jegyzetet a leveleim között, ami bejelentett egy grep nevű programot. Élbűvölően működött. Mikor a vicces névről érdeklődtem, Ken azt mondta, nyilvánvaló. A szerkesztő azon parancsából jött, ami szimulálta a működését: g/re/p (globális reguláris kifejezés kiírás – global regular expression print).” ~ Netizens 9. fejezet: On the Early History and Impact of Unix Tools to Build the Tools for a New Millenium

Dennis MacAlistair Ritchie (1941. szeptember 9-2011. október 12.), a fickó, aki a C-t írta szintén megerősítette a grep nevének eredetét. Ha emlékszel, pár héttel Steve Jobs után hunyt el, csak a világ sajnos alig értesült róla.

[Felvetődött, hogy a forrás egy „A General Regular Expresson Parser” című újság, ám DMR megerősítette a g/re/p etimológiát – ESR] ~ The Jargon File

Soha nem használtam ed-et, ami egy sorszerkesztő és szintén Ken Thompson írta, kivéve az alábbi funkció demonstrációt:

$ ed /etc/passwd
699
g/bash/p
root:x:0:0:root:/root:/bin/bash
brm:x:1000:100::/home/brm:/bin/bash
git:x:619:619:git daemon user:/:/bin/bash
$

A bemeneti fájt a /etc/passwd és a g/bash/p keres. Grep-pel így csinálnánk:

$ grep bash /etc/passwd
root:x:0:0:root:/root:/bin/bash
brm:x:1000:100::/home/brm:/bin/bash
git:x:619:619:git daemon user:/:/bin/bash
$

fgrep, egrep

Az fgrep és az egrep eredetileg különállóak voltak, mivel más parancsok voltak eltérő íróktól. Történelmileg a grep és az egrep felváltva voltak gyorsabbak egymásnál, majd egy parancsban olvadtak össze. Manapság az fgrep és az egrep parancsok kizárólag a kompatibilitás miatt léteznek, hogy az ősrégi scriptek, amik közvetlenül meghívják ezeket, használhatóak legyenek. A helyes használatuk azonban most már grep -F és grep -E. Az -E és az -F kapcsoló a POSIX által meghatározott. A POSIX definiálja a szabványokat a Unix és más operációs rendszerek közötti szoftver kompatibilitás érdekében.

Al Aho, aki szintén a Bell Laboratórium kutatója és az awk társírója volt, írta az egrep és az fgrep parancsokat egy hétvégén 1975-ben.

„Kezdetben Ken Thompson írta a kereső eszközt, a grepet, ami kiválasztotta és kiírta az argumentumként megadott fájlból a megadott reguláris kifejezésre illeszkedő sorokat. 1975-ben, a Unix 6 megjelenése után, Al Aho úgy döntött, hogy megvalósítja az elképzelést és implementálja a teljes reguláris kifejezéseket (ide értve a csoportosításokat is, amik a grep-ből hiányoztak), és egész hétvégén az egrep-et írta. Az fgrep, ami számos alternatív literál kezelésére lett kitalálva, ugyanazon a hétvégén íródott. Az egreg körülbelül kétszer olyan gyors volt, mint a grep egyszerű karakterkeresés során, ám lassabb volt komplexebb keresési mintáknál (a mintafelismerő gép magas költségei miatt).

Azóta mindegyik eszköz teljesítménye javult kissé, főleg a grep (Thompson, majd McMahon) és az egrep (Aho) tulajdonosai közötti rivalizálás miatt.” ~ Grep Wars: The Strategic Search Initiative, Andrew Hume, 1987

Az egrep és az fgrep a Unix 8 grep kézikönyv oldalain jelentek meg.

GNU grep

Ha Linuxot futtatsz, GNU grep-et használsz. Kivéve persze ha szándékosan másféle grep-et telepítettél. ESXi konzolban a grepnek egy korlátozott, busybox változata van. Mac-en BSD grep van. Hogy megtudd, milyen grep-ed van feltelepítve, használd a grep -V parancsot. Egyéb helyeken, ahol a grep az alaptelepítés része, legtöbbször a platform saját verziója van fent. Azt hiszem, tudnál GNU grep-et fordítani, ha szeretnél, de ebbe nem megyünk bele.

A GNU grep-et eredetileg Mike Haerkal írta. Az első verzió 1988-ban lett bejelentve, bár a grep szerepel a GNU’s Bulletin második számában (1987. január): „Egyre több rendszeres használója van a GNU ls, grep, make és id parancsoknak.”

Mike-ot és RMS-t is megkérdeztem, ám egyikük sem emlékezett részletekre. Mike azt mondta, „1988 nyarán. Nem emlékszem a pontos dátumra, de talán késő június vagy kora július azon a nyáron”. RMS felelt, hogy „nem emlékszem 27 év távlatából, ha azt állítottuk a közleményben [GNU's Bulletin, a fordító megjegyzése], akkor igaznak kell lennie”.

Elképzelhető, hogy a GNU grep azelőtt is létezett egy nagyon egyszerű formában, mielőtt Mike kézbe vette az ügyet. Érdemes megjegyezni, hogy Mike Haerkal egyben az AMD-V (az AMD x86-os processzorainak virtualizálása) társtervezője.

Ha tudsz még érdekességeket mondani a grep történetével kapcsolatban és megosztod velem, boldogan meghallgatom és hozzáteszem a poszthoz.

Köszönöm, hogy elolvastad.