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
- superuser má skvělou ilustraci rozdílů mezi grep, egrep, fgrep a pgrep: superuser.com/questions/508881/…
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
nebofgrep
;-E
a-F
jsou standardní. Ve skutečnosti existují malé nekompatibilityegrep
: zachází se{
mírně odlišně. -
fgrep
používá back-end Aho-Corasick, zatímcogrep
používá upravenou verzi Commentz-Walter. To znamená, žegrep
má nejhorší složitost O (mn), zatímcofgrep
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
agrep -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).