Voiko joku kertoa minulle tekniset erot grep
, egrep
ja fgrep
ja antavat sopivia esimerkkejä?
Milloin minun on käytettävä grep
-kohtaa egrep
ja päinvastoin?
Kommentit
- pääkäyttäjällä on hieno esimerkki grepin, egrepin, fgrepin ja pgrep: superuser.com/questions/508881/…
vastaus
Historiallisesti nämä kytkimet toimitettiin erillisissä binääreissä. Joissakin todella vanhoissa Unix-järjestelmissä huomaat, että sinun on soitettava erillisiin binaareihin, mutta kaikissa nykyaikaisissa järjestelmissä kytkimet ovat edullisia. Grepin man-sivulla on tietoja tästä.
Mitä tulee tekemiseen, -E
vaihtaa grep-tilan erityistilaan niin, että lauseke arvioidaan ERE: ksi (Extended Regular Expression) sen normaalin sijaan. kuvion sovitus. Tämän syntaksin yksityiskohdat ovat man-sivulla.
-E, --extended-regexp
Tulkitse PATTERN laajennettuna säännöllisenä lauseke
Kytkin -F
kytkee grepin toiseen tilaan, jossa se hyväksyy vastaavan mallin, mutta sitten jakaa kyseisen mallin yhdeksi hakumerkkijonoksi riviä kohden ja tekee TAI-haun mille tahansa merkkijonolle tekemättä mitään erityistä kuvion sovitusta.
-F, --fixed-strings
Tulkitse PATTERN kiinteiden merkkijonojen luettelona, erotettuna uusilla viivoilla, joista kaikki on sovitettava yhteen.
Tässä on joitain esimerkkitilanteita:
-
Sinulla on tiedosto, jossa on luettelo sanotusta kymmenestä Unix-käyttäjänimestä pelkkänä tekstinä. Haluat etsiä koneesi ryhmätiedostosta nähdäksesi, kuuluuko jokin luetelluista kymmenestä käyttäjästä erityisryhmiin:
grep -F -f user_list.txt /etc/group
Syy
-F
-kytkin auttaa tässä, että kuviotiedostosi käyttäjänimet tulkitaan pelkkänä tekstimerkkijonona. Esimerkiksi pisteet tulkitaan pisteiksi pikemminkin kuin villikortit. -
Haluat tehdä hakuja hienolla lausekkeella. Esimerkiksi sulkeita
()
voidaan käyttää osoittamaan ryhmiä, joissa|
käytetään TAI-operaattorina. Voit suorittaa tämän haun käyttämällä-E
:grep -E "^no(fork|group)" /etc/group
… palataksesi riviä, jotka alkavat jommallakummalla ”nofork” ”tai” noryhmä ”. Ilman kytkintä
-E
joudut välttämään mukana olevia erikoismerkkejä, koska normaalilla kuvasovituksella he vain etsivät tarkkaa mallia;grep "^no\(fork\|group\)" /etc/group
Kommentit
- Joissakin järjestelmissä ei ole ' ei ole
egrep
taifgrep
;-E
ja-F
ovat vakiona. Kohdassaegrep
on itse asiassa pieniä yhteensopimattomuuksia: se kohtelee{
-ohjelmaa hieman eri tavalla. -
fgrep
käyttää Aho-Corasick-taustaa, kun taasgrep
käyttää Commentz-Walterin muokattua versiota. Tämä tarkoittaa, ettägrep
: n vaikeus on O (mn) monimutkaisempi, kun taasfgrep
on pahimmillaan O (m + n). - Gilles " au contraire mon capitan ", joillakin järjestelmillä (ehkä vanhemmilla) ei ehkä ole -F-vaihtoehtoa tavalliseen grepiin, mutta sinulla on fgrep, jotkut ppl valittavat, että alkuperäisessä säikeessä löysin grepin käytön erikoismerkeille
- Tapasin äskettäin Android-järjestelmän, jossa
egrep
jagrep -E
käsittelivät eri suoritettavat tiedostot, BusyBox ja BSD grep. Näillä kahdella variantilla oli käyttäytymiseroja muille kuin Posix-regex-rakenteille, kuten\s
. Tämä aiheutti paljon sekaannusta …
Vastaus
Lähettäjä 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.
Käytät fgrep
tai grep -F
jos et ”t halua, että greppattu merkkijono tulkitaan kuviona.
Käytät egrep
tai grep -E
jos haluat käyttää laajennettua regexp-koodia.
Vastaa
egrep
ja fgrep
vastaavat periaatteessa grep -E
ja grep -F
(vastaavasti):
-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.)
Virheilmoitukset voivat kuitenkin poiketa toisistaan.
Kommentit
- ok, mutta mikä on laajennettu säännöllinen lauseke? Se ei ' ei todellakaan selitä alla. Muutama esimerkki olisi hyvä …
- @isomorphismes: Tämä wikikirjolinkki selittää sen hienosti …
Vastaa
Lähettäjä ”man grep”:
käytettävissä on kolme muunnosohjelmaa, egrep, fgrep ja rgrep. egrep on sama kuin grep -E. fgrep on sama kuin grep -F. rgrep on sama kuin grep -r. Suora kutsu joko egrep- tai fgrep-tiedostona on vanhentunut, mutta se on annettu sallimaan niihin perustuvien historiallisten sovellusten ajaa muokkaamattomina.
Kommentit
- Kysymys pyytää sopivan esimerkin.
Vastaa
Jos haet sanatarkasta merkkijonosta ja haluat olla varma, että välittämäsi merkkijono tulkitaan sanatarkasti (eli vaarantamatta, että sanotaan, että piste tai kysymysmerkki tulkitaan joksikin muuksi), käytä fgrep tai egrep -F.
Mitä tulee egrepin ja grepin eroon, mielestäni egrep on suurimman osan ajasta haluamasi asia. GNU-käsikirja-sivustossa luetellaan erot grepin ja egrepin välillä, jotka näyttävät olevan syntaksissa: jotkut asiat vaativat vinoviivoja, kun taas toiset eivät. Uskon, että egrep on ”yhteensopivampi” perl regexpsin ja javascript regexps: n kanssa, joten egrepin käyttö on minulle helpompaa. Kannustan sinua todella kokeilemaan ack – se tukee PREG-tiedostoja ja sillä on enemmän hyödyllisiä oletusasetuksia (eli väritys, ohitettavien luultavasti ei-mitä-haluat-hakemistot) kuten .svn, kyky seurata linkkejä, ja ack: n kirjoittaminen on hieman helpompaa kuin grep -E).