Může mi někdo říct technické rozdíly mezi grep, egrep a fgrep a uvést vhodné příklady?

Kdy musím použít grep přes egrep a naopak?

Komentáře

Odpověď

Historicky byly tyto přepínače poskytovány v samostatných binárních souborech. Na některých opravdu starých unixových systémech zjistíte, že musíte volat samostatné binární soubory, ale na všech moderních systémech jsou preferovány přepínače. Manová stránka pro grep má o tom podrobnosti.

Pokud jde o to, co dělají, -E přepne grep do zvláštního režimu, takže výraz je na rozdíl od normálu vyhodnocen jako ERE (Extended Regular Expression). porovnávání vzorů. Podrobnosti o této syntaxi jsou na hlavní stránce.

-E, --extended-regexp
Interpretovat VZOR jako rozšířený regulární soubor výraz

Přepínač -F přepne grep do jiného režimu, kde přijímá odpovídající vzor, ale poté rozdělí tento vzor na jeden vyhledávací řetězec na řádek a provede vyhledávání NEBO na kterémkoli z řetězců, aniž by provedl nějaké speciální porovnávání vzorů.

-F, --fixed-strings
Interpretovat PATTERN jako seznam pevných řetězců oddělených novými řádky, z nichž každý se má shodovat.

Zde je několik příkladů:

  • Máte soubor se seznamem řekněme deseti uživatelských jmen Unixu v prostém textu. Chcete prohledat soubor skupiny na vašem počítači a zjistit, zda některý z deseti uvedených uživatelů není ve zvláštních skupinách:

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

    Důvod, proč -F přepínač zde pomáhá v tom, že uživatelská jména ve vašem souboru se vzorem jsou interpretována jako řetězce prostého textu. Tečky by například byly interpretovány spíše jako tečky než jako divoké karty.

  • Chcete hledat pomocí efektního výrazu. Například závorky () lze použít k označení skupin, ve kterých se | používá jako operátor OR. Toto vyhledávání můžete spustit pomocí -E:

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

    … k vrácení řádků začínajících buď „nofork“ „nebo“ podskupina „. Bez přepínače -E byste museli uniknout příslušným speciálním znakům, protože při normálním porovnávání vzorů by hledali pouze tento přesný vzor;

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

Komentáře

  • Některé systémy ' nemají egrep nebo fgrep; -E a -F jsou standardní. Ve skutečnosti existují malé nekompatibility egrep: zachází se { mírně odlišně.
  • fgrep používá back-end Aho-Corasick, zatímco grep používá upravenou verzi Commentz-Walter. To znamená, že grep má nejhorší složitost O (mn), zatímco fgrep je nejhorší O (m + n).
  • Gilles " au contraire mon capitan ", některé systémy (možná starší) nemusí mít možnost -F na standardní grep, ale mít fgrep, někteří ppl si stěžují na to na původním vlákně, které jsem našel o použití grepu pro speciální znaky
  • Nedávno jsem se stal v systému Android, na kterém egrep a grep -E byly zpracovány různými spustitelnými soubory, BusyBox a BSD grep. Tyto dvě varianty měly rozdíly v chování u konstrukcí jiných než Posix regex, například \s. To vedlo k velkému zmatku …

Odpověď

Z 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. 

Používáte fgrep nebo grep -F pokud Don „t nechcete, aby byl grepovaný řetězec interpretován jako vzor.

Používáte egrep nebo grep -E pokud potřebujete použít rozšířený regulární výraz.

Odpověď

egrep a fgrep jsou v zásadě ekvivalentní s grep -E a grep -F (v uvedeném pořadí):

  -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.)  

Chybové zprávy se však mohou lišit.

Komentáře

  • ok, ale co je je rozšířený regulární výraz? Níže to ' opravdu nevysvětluje. Několik příkladů by bylo hezkých …
  • @isomorphismes: Tento odkaz na wikibooky to pěkně vysvětluje …

Odpověď

Od „man grep“:

jsou k dispozici tři varianty programů egrep, fgrep a rgrep. egrep je stejný jako grep -E. fgrep je stejný jako grep -F. rgrep je stejný jako grep -r. Přímé vyvolání jako egrep nebo fgrep je zastaralé, ale je poskytováno, aby umožňovalo historickým aplikacím, které na ně spoléhají, běžet beze změn.

Komentáře

  • Tato otázka požaduje vhodný příklad.

Odpověď

Pokud hledáte doslovný řetězec a chcete si být jisti, že řetězec, který jste předali, je interpretován doslovně (tj. bez rizika, že řeknete, že tečka nebo otazník budou interpretovány jako něco jiného), použijte fgrep nebo egrep -F.

Pokud jde o rozdíl mezi egrep a grep, myslím, že egrep je většinou to, co chcete. Manuální stránka GNU uvádí rozdíly mezi grep a egrep, které, jak se zdá, leží v syntaxi: některé věci vyžadují lomítka, zatímco jiné ne. Myslím, že egrep je více „kompatibilní“ s regulárními výrazy perl a regulárními výrazy javascript, takže je pro mě snadnější používat egrep.

Btw. Opravdu vám doporučuji vyzkoušet ack – podporuje PREG a má užitečnější výchozí hodnoty (tj. Vybarvení, přeskakování adresářů pravděpodobně ne-co-chcete) jako .svn, schopnost sledovat symbolické odkazy, a je o něco snazší psát ack než grep -E).

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *