Grep, egrep ve fgrep arasındaki fark nedir?


Yanıtlar:


292

Tarihsel olarak bu anahtarlar ayrı ikili dosyalarda sağlanmıştır. Gerçekten eski bazı Unix sistemlerinde, ayrı ikili dosyaları aramanız gerektiğini göreceksiniz, ancak tüm modern sistemlerde anahtarlar tercih ediliyor. Grep'in man sayfası bununla ilgili detaylara sahiptir.

Yaptıklarına gelince, -Egrep'i özel bir moda geçirir, böylece ifade normal desen eşleşmesinin aksine bir ERE (Genişletilmiş Normal İfade) olarak değerlendirilir. Bu sözdiziminin detayları man sayfasında.

-E, --extended-regexp
DESEN'i genişletilmiş düzenli ifade olarak yorumla

-FAnahtar bu maç için bir desen kabul eden bir başka moduna grep geçer, ama sonra satır başına bir arama dizisi içine örnek modelin böler ve herhangi bir özel desen eşleştirme yapmadan dizeleri herhangi bir OR arama yapar.

-F, --fixed-strings
DESEN'i, biriyle eşleştirilecek, yeni satırlarla ayrılmış, sabit dizelerin bir listesi olarak yorumlayın.

İşte bazı örnek senaryolar:

  • Düz metinde on Unix kullanıcı adının yer aldığı bir listeniz var. Listelenen on kullanıcıdan birinin herhangi bir özel grupta olup olmadığını görmek için makinenizdeki grup dosyasını aramak istiyorsunuz:

    grep -F -f user_list.txt /etc/group
    

    -FAnahtarın burada yardımcı olmasının nedeni, kalıp dosyanızdaki kullanıcı adlarının düz metin dizeleri olarak yorumlanmasıdır. Örneğin noktalar, joker karakterler yerine noktalar olarak yorumlanır.

  • Süslü bir ifade kullanarak aramak istiyorsunuz. Örneğin parantez (), |bir OR operatörü olarak kullanılan grupları belirtmek için kullanılabilir. Bu aramayı aşağıdakileri kullanarak çalıştırabilirsiniz -E:

    grep -E '^no(fork|group)' /etc/group
    

    ... "nofork" veya "nogroup" ile başlayan satırları döndürmek için. -EAnahtar olmadan, özel karakterlerden kaçmak zorunda kalacaksınız, çünkü normal desen eşleşmesiyle sadece o kesin deseni arayacaklar;

    grep '^no\(fork\|group\)' /etc/group
    

17
Bazı sistemlerde yoktur egrepveya fgrep; -Eve -Fstandart. Aslında küçük uyumsuzluklar var egrep: {biraz farklı davranıyor .
Gilles,

4
fgrepgrepCommentho-Walter'ın değiştirilmiş bir versiyonunu kullanırken, Aho-Corasick arka ucunu kullanır. Bu grep, en kötü durumda fgrepO (m + n) iken en kötü durumda O (mn) karmaşıklığına sahip olduğu anlamına gelir .
Slater Victoroff

2
Gilles "au contraire mon capitan", bazı sistemler (belki daha eski) standart grep için -F seçeneğine sahip olmayabilir, ancak bir fgrep var; bazı ppl, özel karakterlerde grep kullanma konusunda bulduğum asıl konu hakkında şikayette bulundu
THESorcerer

Geçenlerde bir Android sistemi üzerine oldu hangi egrepve grep -Efarklı yürütülebilir, BusyBox ve BSD grep tarafından ele alındı. İki varyant, Posix dışındaki regex yapıları için davranışsal farklılıklara sahipti \s. Bu çok kafa karışıklığına yol açtı ...
Lii

33

Kimden man grep:

 egrep grep -E ile aynıdır.
 fgrep grep -F ile aynıdır. Egrep veya  
  fgrep kullanımdan kaldırıldı, ancak geçmiş uygulamalara izin vermek için sağlandı
  değiştirilmemiş çalıştırmak için onlara güveniyor.

Kullanamaz fgrepveya grep -Feğer yok istiyorum grepped dize bir desen olarak yorumlanmalıdır.

Kullanamaz egrepveya grep -Eihtiyacınız varsa genişletilmiş Regexp'i kullanmak.


13

egrepve fgreptemelde eşittir grep -Eve grep -F(sırasıyla):

   -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.)

Hata mesajları olsa farklı olabilir.


2
Tamam, ama ne olduğunu bir genişletilmiş düzenli ifade? Aşağıda gerçekten açıklamıyor. Birkaç örnek güzel olurdu ...
isomorphismes

@isomorphismes: Bu wikibooks linki güzelce açıklıyor ...
zb226

8

"Grep Grep" den:

üç değişken programı egrep, fgrep ve rgrep mevcuttur. egrep grep -E ile aynıdır. fgrep grep -F ile aynıdır. rgrep grep -r ile aynıdır. Egrep veya fgrep olarak yapılan doğrudan çağrı kullanımdan kaldırılmıştır, ancak bunlara dayanan tarihsel uygulamaların değiştirilmemiş olarak çalışmasına izin vermek için sağlanmıştır.


2
Soru uygun bir örnek ister.
isomorphismes

3

Bir sözlü dize ararsanız ve geçirdiğiniz dizenin sözlü olarak yorumlandığından emin olmak istiyorsanız (yani, bir nokta veya soru işaretinin başka bir şey olarak yorumlanacağını riske atmadan) fgrep veya egrep -F kullanın.

Egrep ve grep arasındaki fark gelince, egrep'in çoğu zaman istediğiniz şey olduğunu düşünüyorum. GNU manuel sitesi , grep ve sözdiziminde yatıyor gibi görünen egrep arasındaki farkları listeler: bazı şeyler eğik çizgi gerektirir, bazıları ise kesik çizgi gerektirmez. Egrep'in perl regexps ve javascript regexps ile daha "uyumlu" olduğunu düşünüyorum, bu yüzden egrep kullanmak benim için daha kolay.

Btw. Gerçekten vermek için teşvik ack bir denemede - bu Pregs destekler ve (daha kullanışlı kusurlarının olması yani renklendirme, .svn, Sembolik takip yeteneği gibi muhtemelen-olmayan-ne isterse onu dizinleri atlayarak, ve yazmanın biraz daha kolay grep'e göre ack -E).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.