Herkes bana arasındaki teknik farklılıkları söyleyebilir grep
, egrep
ve fgrep
ve sağlamak uygun örnekler?
Ne zaman kullanmak gerekiyor grep
üzerinde egrep
ve tersi?
Herkes bana arasındaki teknik farklılıkları söyleyebilir grep
, egrep
ve fgrep
ve sağlamak uygun örnekler?
Ne zaman kullanmak gerekiyor grep
üzerinde egrep
ve tersi?
Yanıtlar:
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, -E
grep'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
-F
Anahtar 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
-F
Anahtarı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. -E
Anahtar 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
egrep
veya fgrep
; -E
ve -F
standart. Aslında küçük uyumsuzluklar var egrep
: {
biraz farklı davranıyor .
fgrep
grep
Commentho-Walter'ın değiştirilmiş bir versiyonunu kullanırken, Aho-Corasick arka ucunu kullanır. Bu grep
, en kötü durumda fgrep
O (m + n) iken en kötü durumda O (mn) karmaşıklığına sahip olduğu anlamına gelir .
egrep
ve grep -E
farklı 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ı ...
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 fgrep
veya grep -F
eğer yok istiyorum grepped dize bir desen olarak yorumlanmalıdır.
Kullanamaz egrep
veya grep -E
ihtiyacınız varsa genişletilmiş Regexp'i kullanmak.
egrep
ve fgrep
temelde eşittir grep -E
ve 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.
"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.
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).