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

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 tai fgrep; -E ja -F ovat vakiona. Kohdassa egrep on itse asiassa pieniä yhteensopimattomuuksia: se kohtelee { -ohjelmaa hieman eri tavalla.
  • fgrep käyttää Aho-Corasick-taustaa, kun taas grep käyttää Commentz-Walterin muokattua versiota. Tämä tarkoittaa, että grep: n vaikeus on O (mn) monimutkaisempi, kun taas fgrep 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 ja grep -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).

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *