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?
Historicky byly tyto přepínače poskytovány v samostatných binárních souborech. U některých opravdu starých unixových systémů zjistíte, že musíte zavolat samostatné binární soubory, ale u všech moderních systémů jsou přepínače preferovány. Manová stránka grepu obsahuje podrobnosti.
Co se děje, -E
přepne grep do zvláštního režimu, takže výraz je vyhodnocen jako ERE (Extended Regular Expression) na rozdíl od jeho normálního přizpůsobení vzoru. Podrobnosti o této syntaxi jsou na stránce man.
-E, --extended-regexp
Interpretovat PATTERN jako rozšířený regulární výraz
The -F
přepínač přepne grep do jiného režimu, kde přijímá vzor, který odpovídá, ale pak rozdělí tento vzorec do jednoho vyhledávacího řetězce na řádek a provede OR vyhledávání na kterémkoli z řetězců bez provedení) jakákoli speciální shoda vzorů.
-F, --fixed-strings
Interpretovat PATTERN jako seznam pevných řetězců oddělených novými řádky, z nichž každý musí být uzavřen.
Zde je několik příkladů:
Máte soubor se seznamem deseti uživatelských jmen Unixu v prostém textu. Chcete prohledat soubor skupiny v počítači a zjistit, zda některý z deseti uvedených uživatelů není v nějaké zvláštní skupině:
grep -F -f user_list.txt /etc/group
Důvod -F
Přepínač pomáhá zde je, že uživatelská jména v souboru se vzorem jsou interpretována jako řetězce prostého textu. Například tečky by byly interpretovány spíše jako tečky než divoké karty.
Chcete hledat pomocí efektního výrazu. Například závorka ()
lze použít k označení skupin pomocí |
použito jako operátor OR). Toto vyhledávání můžete spustit pomocí -E
:
grep -E '^no(fork|group)' /etc/group
... pro vrácení řádků začínajících buď „nofork“ nebo „nogroup“. Bez -E
přepínač, měli byste uniknout zahrnutým zvláštním znakům, protože při normální shodě vzoru by jen hledali ten přesný vzor;
grep '^no\(fork\|group\)' /etc/group
Z man grep
:
egrep je stejný jako grep -E. fgrep je stejný jako grep -F. Přímé vyvolání jako egrep nebo Fgrep je zastaralé, ale je poskytováno, aby umožnilo historickým aplikacím , Které se na ně spoléhají, běžet beze změny.
Používáte fgrep
nebo grep -F
pokud nechcete chcete, aby byl grepped řetězec interpretován jako vzor.
Používáte egrep
nebo grep -E
pokud potřebujete použít rozšířenou regexp.
egrep
a fgrep
jsou v podstatě rovnocenné s grep -E
a grep -F
(příslušně):
-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.
Z „man grep“:
k dispozici jsou 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 historické aplikace, které se na ně spoléhají, mohly běžet beze změny.
Pokud hledáte doslovný řetězec a chcete si být jisti, že řetězec, který jste předali, je interpretován doslovně (tj. Aniž byste riskovali, že se tečka nebo otazník bude interpretovat 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. The GNU manuální stránka uvádí rozdíly mezi grep a egrep, které se zdají ležet 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 javascript, takže je pro mě jednodušší používat egrep.
Mimochodem. Opravdu vás vyzývám, abyste zkusili ack vyzkoušejte - podporuje PREG a má užitečnější výchozí hodnoty (tj. Zbarvení, přeskakování adresářů pravděpodobně ne-co-vy, jako .svn, schopnost sledovat symlinks, a je o něco snazší psát ack než grep -E).