Tudna valaki mondani technikai különbségeket grep, egrep és fgrep és adjon meg megfelelő példákat?

Mikor kell használnom a grep elemet a egrep és fordítva?

Megjegyzések

Válasz

Történelmileg ezeket a kapcsolókat külön bináris fájlokban adták meg. Néhány valóban régi Unix rendszeren azt tapasztalhatja, hogy külön bináris fájlokat kell hívnia, de minden modern rendszerben a kapcsolókat részesítik előnyben. A grep kézikönyvének részletei erről szólnak.

Ami a tevékenységüket illeti, a -E a grep-et speciális módba kapcsolja, így a kifejezést ERE-ként (Extended Regular Expression) értékelik a normálissal szemben. minta illesztése. Ennek a szintaxisnak a részletei a man oldalon találhatók.

-E, --extended-regexp
A PATTERN-t kiterjesztett szabályként értelmezze. kifejezés

A -F kapcsoló a grep-t egy másik módba kapcsolja, ahol elfogadja a megfelelő mintát, de aztán felosztja ezt a mintát soronként egy keresési karakterláncra, és VAGY keresést végez bármelyik karaktersorozaton, anélkül, hogy bármilyen speciális mintaillesztést végezne. “45531571cb”>

A PATTERN-t úgy értelmezheti, mint egy rögzített karakterláncot, új vonallal elválasztva, amelyek mindegyikét ki kell illeszteni.

Íme néhány példa:

  • Van egy fájl, amelyen mondjuk tíz Unix felhasználónév szerepel egyszerű szövegben. A számítógépén meg akarja keresni a csoportfájlt, és megnézheti, hogy a felsorolt tíz felhasználó közül valamelyik speciális csoportba tartozik-e:

    grep -F -f user_list.txt /etc/group 

    A -F kapcsoló segít abban, hogy a minta fájljában szereplő felhasználóneveket egyszerű szöveges karakterláncként értelmezzük. A pontokat például pontként értelmezzük, nem pedig wild-card-okként.

  • Díszes kifejezéssel szeretne keresni. Például a () zárójel arra használható, hogy | csoportokat jelöljünk OR operátorként. A -E használatával futtathatja ezt a keresést:

    grep -E "^no(fork|group)" /etc/group 

    … a “nofork” betűvel kezdődő sorok visszaadásához “vagy” nocsoport “. A -E kapcsoló nélkül meg kell kerülnie az érintett speciális karaktereket, mert normál mintaillesztéssel csak erre a pontos mintára keresnek;

    grep "^no\(fork\|group\)" /etc/group 

Megjegyzések

  • Bizonyos rendszerek nem ' nem rendelkeznek egrep vagy fgrep; A -E és a -F alapfelszereltség. A egrep fájlban valójában kis inkompatibilitások vannak: a { -et kissé másként kezeli.
  • fgrep az Aho-Corasick háttérprogramot használja, míg a grep a Commentz-Walter módosított változatát. Ez azt jelenti, hogy a grep legrosszabb esetben O (mn) komplexitással bír, míg a fgrep legrosszabb esetben O (m + n).
  • Gilles " au contraire mon capitan ", egyes rendszereknek (talán régebbi) nem biztos, hogy -F opciója van a standard grep használatához, de van egy fgrep-je, néhány ppl panaszkodik arra, hogy az eredeti szálon a grep speciális karakterekhez való használatáról találtam
  • Nemrégiben egy olyan Android rendszeren fordultam elő, amelyen egrep és A grep -E programokat különböző futtatható fájlok, a BusyBox és a BSD grep kezelték. A két változat viselkedési különbségeket mutat a nem Posix regex konstrukciók esetében, például \s. Ez sok zavart okozott …

Válasz

Feladó: man grep:

 egrep is the same as grep -E. fgrep is the same as grep -F. Direct invocation as either egrep or fgrep is deprecated, but is provided to allow historical applications that rely on them to run unmodified. 

fgrep vagy grep -F ne “t azt akarja, hogy a greppelt karakterlánc mintaként értelmezzen.

A egrep vagy a grep -E ha kiterjesztett regexp-et kell használnia.

Válasz

egrep és fgrep alapvetően egyenértékű grep -E és grep -F (vagy rendre):

  -E, --extended-regexp Interpret PATTERN as an extended regular expression (ERE, see below). (-E is specified by POSIX.) -F, --fixed-strings Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched. (-F is specified by POSIX.)  

A hibaüzenetek mégis eltérhetnek.

Megjegyzések

  • oké, de mi a egy kiterjesztett szabályos kifejezés? Nem igazán magyarázza az alábbiakban '. Néhány példa jó lenne …
  • @isomorphismes: Ez a wikikönyvek link szépen megmagyarázza …

Válasz

A “man grep” feladóból:

Három variáns program, az egrep, az fgrep és az rgrep áll rendelkezésre. Az egrep ugyanaz, mint a grep -E. Az fgrep ugyanaz, mint a grep -F. Az rgrep ugyanaz, mint a grep -r. Az egrep vagy az fgrep közvetlen meghívás elavult, de azért van megadva, hogy a rájuk támaszkodó történelmi alkalmazások módosulatlanul fussanak.

Megjegyzések

  • A kérdés megfelelő példát kér.

Válasz

Ha szó szerinti karakterláncra keres, és biztos akar lenni abban, hogy az átadott karakterlánc szó szerinti értelmezésű (azaz anélkül, hogy megkockáztatná, hogy egy pontot vagy kérdőjelet valami másként fognak értelmezni) használja az fgrep vagy az egrep -F parancsokat.

Ami az egrep és a grep különbségét illeti, azt hiszem, hogy az egrep legtöbbször a kívánt dolog. A GNU kézi webhelye felsorolja a grep és az egrep közötti különbségeket, amelyek látszólag a szintaxisban rejlenek: egyes dolgok perjeleket igényelnek, mások nem. Úgy gondolom, hogy az egrep jobban “kompatibilis” a perl regexps és a javascript regexps-kel, így nekem könnyebb használni az egrep-et.

Btw. Nagyon bátorítalak benneteket, hogy próbálkozzanak a ack próbával – támogatja a PREG-ket, és hasznosabb alapértelmezéseket tartalmaz (pl. Színezés, valószínűleg nem a kívánt könyvtárak kihagyása) mint a .svn, a szimpla linkek követési képessége, és “könnyebb az ack beírása, mint a grep -E).

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük