Kan noen fortelle meg de tekniske forskjellene mellom grep
, egrep
, og fgrep
og gi passende eksempler?
Når trenger jeg å bruke grep
over egrep
og omvendt?
Kommentarer
- superbruker har en flott illustrasjon av forskjellene mellom grep, egrep, fgrep og pgrep: superbruker.com/questions/508881/…
Svar
Historisk ble disse bryterne gitt i separate binærfiler. På noen virkelig gamle Unix-systemer vil du oppdage at du trenger å ringe de separate binærfilene, men på alle moderne systemer er bryterne foretrukket. Mannsiden for grep har detaljer om dette.
Når det gjelder hva de gjør, bytter -E
grep til en spesiell modus slik at uttrykket blir evaluert som en ERE (Extended Regular Expression) i motsetning til det normale mønstermatching. Detaljer om denne syntaksen er på mansiden.
-E, --extended-regexp
Tolk MØNSTER som en utvidet regulær uttrykk
-F
-bryteren bytter grep til en annen modus der den godtar et mønster å matche, men deretter deler mønsteret opp i en søkestreng per linje og søker ELLER på noen av strengene uten å gjøre noe spesielt mønstermatching.
-F, --fixed-strings
Tolk MØNSTER som en liste over faste strenger, atskilt med nye linjer, hvorav noen skal matches.
Her er noen eksempler på scenarier:
-
Du har en fil med en liste over si ti Unix-brukernavn i ren tekst. Du vil søke i gruppefilen på maskinen din for å se om noen av de ti brukerne som er oppført, er i noen spesielle grupper:
grep -F -f user_list.txt /etc/group
Årsaken til at
-F
bryteren hjelper her er at brukernavnene i mønsterfilen din blir tolket som ren tekststrenger. Prikker vil for eksempel tolkes som prikker i stedet for jokertegn. -
Du vil søke med et fancy uttrykk. For eksempel kan parentes
()
brukes til å indikere grupper med|
brukt som OR-operator. Du kan kjøre dette søket ved hjelp av-E
:grep -E "^no(fork|group)" /etc/group
… for å returnere linjer som starter med «nofork» «eller» noggroup «. Uten
-E
-bryteren, må du unnslippe spesialtegnene som er involvert, fordi de ved normal mønstermatching bare vil søke etter det nøyaktige mønsteret;
Kommentarer
- Noen systemer har ' t har
egrep
ellerfgrep
;-E
og-F
er standard. Det er faktisk små inkompatibiliteter iegrep
: det behandler{
litt annerledes. -
fgrep
bruker Aho-Corasick-backend, mensgrep
bruker en modifisert versjon av Commentz-Walter. Dette betyr atgrep
har en verste fall O (mn) kompleksitet mensfgrep
i verste fall er O (m + n). - Gilles " au contraire mon capitan ", noen systemer (eldre kanskje) har kanskje ikke -F mulighet til standard grep, men har en fgrep, noen ppl klager over det på originaltråden jeg fant om å bruke grep til spesialtegn
- Jeg har nylig skjedd på et Android-system der
egrep
oggrep -E
ble håndtert av forskjellige kjørbare filer, BusyBox og BSD grep. De to variantene hadde atferdsforskjeller for ikke-Posix regex-konstruksjoner, for eksempel\s
. Dette førte til mye forvirring …
Svar
Fra 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.
Du bruker fgrep
eller grep -F
du ikke vil at den grepede strengen skal tolkes som et mønster.
Du bruker egrep
eller grep -E
hvis du trenger å bruke en utvidet regexp.
Svar
egrep
og fgrep
tilsvarer i utgangspunktet grep -E
og grep -F
:
-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.)
Feilmeldinger kan variere.
Kommentarer
- ok, men hva er et utvidet regulært uttrykk? Det forklarer ikke ' nedenfor. Noen få eksempler vil være fine …
- @isomorphismes: Denne wikibooks-lenken forklarer det pent …
Svar
Fra «man grep»:
tre variantprogrammer egrep, fgrep og rgrep er tilgjengelig. egrep er det samme som grep -E. fgrep er det samme som grep -F. rgrep er det samme som grep -r. Direkte påkalling som enten egrep eller fgrep er utfaset, men er gitt for å la historiske applikasjoner som er avhengige av dem kjøre umodifisert. ul class = «comments»>
Spørsmålet ber om et passende eksempel.
Svar
Hvis du søker etter en ordrett streng, og vil være sikker på at strengen du sendte tolkes ordrett (dvs. uten å risikere at et punktum eller spørsmålstegn blir tolket som noe annet) bruker fgrep eller egrep -F.
Når det gjelder forskjellen mellom egrep og grep, tror jeg at egrep mesteparten av tiden er det du vil ha. GNUs manuelle nettsted viser forskjellene mellom grep og egrep som ser ut til å ligge i syntaksen: noen ting krever skråstrek mens andre ikke gjør det. Jeg tror at egrep er mer «kompatibelt» med perl regexps og javascript regexps, så det er lettere for meg å bruke egrep.
Btw. Jeg oppfordrer deg virkelig til å prøve ack – den støtter PREGs, og har mer nyttige standarder (dvs. fargelegging, hopper over kataloger som sannsynligvis ikke er som .svn, muligheten til å følge symlinker, og det er litt lettere å skrive ack enn grep -E).