Koks skirtumas tarp „Grep“, „Egrep“ ir „Fgrep“ sistemoje „Linux“?


Vienas iš žinomiausių „Unix“ tipo sistemų paieškos įrankių, kurį galima naudoti norint ieškoti bet ko, nesvarbu, ar tai failas, ar eilutė, ar kelios eilutės faile, yra „grep“ įrankis. Tai labai platus funkcionalumas, kurį galima priskirti daugeliui palaikomų parinkčių, tokių kaip: paieška naudojant eilutės modelį, reg-ex modelį arba perl pagrįstą reg-ex ir kt.

Dėl įvairių funkcijų jis turi daugybę variantų, įskaitant „grep“, „egrep“ (išplėstinis GREP), „fgrep“ (fiksuotas „GREP“), „pgrep“ („procesas GREP“), „rgrep“ („rekursyvus GREP“) ir kt. Tačiau šie variantai turi nedidelių skirtumų nuo originalaus grep, dėl kurio populiarus ir naudojamas įvairių „Linux“ programuotojų atliekant konkrečias užduotis.

Pagrindinis dalykas, kurį dar reikia ištirti, yra kokie yra trijų pagrindinių variantų, ty „grep“, „egrep“ ir „fgrep“ skirtumai, dėl kurių „Linux“ vartotojai priverčia pasirinkti vieną ar kitą versiją pagal reikalavimus.

Keletas specialių grepo metaženklių

  1. + - atitinka vieną ar kelis ankstesnio simbolio atvejus.
  2. ? - tai žymi beveik vieną ankstesnio simbolio pasikartojimą. Pvz .: a? atitiktų „a“ arba „aa“.
  3. ( - kaitaliojimo išraiškos pradžia.
  4. ) - kaitaliojimo išraiškos pabaiga.
  5. | - atitinka bet kurį išraišką, atskirtą | . Pvz .: „(a | b) cde“ atitiktų „abcde“ arba „bbcde“.
  6. { - šis metaženklas nurodo diapazono specifikatoriaus pradžią. Panašu: „a {2}“ faile atitinka „aa“, t. Y. 2 kartus.
  7. } - šis metaženklas nurodo diapazono pabaigos specifikatorių.

Skirtumai tarp grep, egrep ir fgrep

Kai kuriuos pagrindinius grep, egrep ir fgrep skirtumus galima pabrėžti taip. Šiam pavyzdžių rinkiniui darome prielaidą, kad bus failas, su kuriuo atliekama operacija:

„grep“ arba „Global Regular Expression Print“ yra pagrindinė paieškos programa „Unix“ tipo sistemose, kuri gali ieškoti bet kokio tipo eilutės bet kuriame faile, failų sąraše ar net bet kurios komandos išvestyje.

Kaip paieškos šabloną, be įprastų eilučių, naudojami pagrindiniai reguliarūs posakiai. Pagrindiniuose reguliariuosiuose reiškiniuose (BRE) tokie metaženklai kaip: {,} , (,) , | , + , ? praranda savo reikšmę ir yra traktuojami kaip įprasti eilutės simboliai, todėl norint juos traktuoti kaip specialiuosius simbolius, jų reikia išvengti.

Be to, „grep“ naudoja „Boyer-Moore“ algoritmą, kad greitai ieškotų bet kokios eilutės ar reguliariosios išraiškos.

$ grep -C 0 '(f|g)ile' check_file
$ grep -C 0 '\(f\|g\)ile' check_file

Kaip čia, kai komanda vykdoma neišvengiant () ir | , ji ieškojo visos eilutės, ty “(f | g) ile” faile. Bet kai specialieji simboliai buvo išvengta, tada grep užuot juos traktuojęs kaip eilutės dalį, juos traktuojo kaip metaženklius ir ieškojo žodžių „file“ arba „gile“ byloje.

Egrep arba grep -E yra kita grep arba išplėstinio grep versija. Ši „grep“ versija yra efektyvi ir greita, kai reikia ieškoti taisyklingos išraiškos šablono, nes ji traktuoja metaženklus tokius, kokie yra, ir nepakeičia jų kaip stygų kaip „grep“, taigi jūs esate atleidžiamas nuo naštos, kad negalėtumėte jų išvengti. grep. Jis naudoja ERE arba išplėstinio reguliaraus reiškinio rinkinį.

„Egrep“ atveju, net jei neišvengsite metaženklų, jis juos traktuotų kaip specialiuosius simbolius ir pakeistų jų ypatingą reikšmę, o ne traktuotų kaip eilutės dalį.

$ egrep -C 0 '(f|g)ile' check_file
$ egrep -C 0 '\(f\|g\)ile' check_file

Kaip ir čia, egrep ieškojo eilutės „file“ , kai metametražų neišvengėme, kaip tai reikštų pagal šių simbolių reikšmę. Bet kai šie simboliai buvo išvengta, tada egrep juos laikė eilutės dalimi ir ieškojo faile visos eilutės “(f | g) ile” .

„Fgrep“ arba „Fixed grep“ arba „grep -F“ yra dar viena „grep“ versija, kuri greitai ieško, kai reikia ieškoti visos eilutės, o ne reguliariosios išraiškos, nes ji neatpažįsta įprastų išraiškų ir jokių metaženklių. Jei norite ieškoti bet kokios tiesioginės eilutės, tai turėtų būti pasirinkta grep versija.

„Fgrep“ ieško visos eilutės ir net neatpažįsta specialiųjų simbolių kaip reguliariosios išraiškos dalies, net jei pabėgo ar neišvengė.

$ fgrep -C 0 '(f|g)ile' check_file
$ fgrep -C 0 '\(f\|g\)ile' check_file

Panašiai, kai nepavyko pabėgti nuo metaženklų, „fgrep“ ieškojo faile visos eilutės “(f | g) ile” , o kai metaženklai buvo išvengta, komanda fgrep ieškojo „\ (f\| g \) ile“ visi simboliai, esantys faile.

Mes jau apėmėme keletą praktinių „grep“ komandos pavyzdžių, kuriuos galite perskaityti čia, jei norite gauti daugiau naudos iš „grep“ komandos „Linux“.

Išvada

Aukščiau paryškinti skirtumai tarp „grep“, „egrep“ ir „fgrep“. Be naudojamų reguliarių išraiškų rinkinio skirtumo ir vykdymo greičio, poilsio komandinės eilutės parametrai išlieka vienodi visose trijose grep versijose ir netgi vietoj „egrep“ ar „fgrep“, „grep -E“ arba „grep - F “rekomenduojama naudoti.

Jei radote kitų skirtumų tarp šių trijų „grep“ versijų, paminėkite juos savo komentaruose.