Grep vs awk kullanma


17

Belirli bir desen yakalamak awkve grepkullanılabilir. Neden birini diğerinin üzerine kullanmalıyız? Hangisi daha hızlı ve neden?

Bir günlük dosyam olsaydı ve belirli bir kalıbı kapmak isteseydim, aşağıdakilerden birini yapabilirdim

awk '/pattern/' /var/log/messages

veya

grep 'pattern' /var/log/messages

Hiçbir kıyaslama yapmadım, bu yüzden bilemezdim. Birisi bunu detaylandırabilir mi? Bu iki aracın iç işleyişini bilmek harika.


Komutun timeçalıştırılmasının ne kadar süreceğini belirleyen komutla kabuk komut dosyalarında bile herhangi bir komuttan önce. Ör: time ls -l.
Ağustos'ta Bulrush

Yanıtlar:


26

grep büyük olasılıkla daha hızlı olacaktır:

# time awk '/USAGE/' imapd.log.1 | wc -l
73832

real    0m2.756s
user    0m2.740s
sys     0m0.020s

# time grep 'USAGE' imapd.log.1 | wc -l
73832

real    0m0.110s
user    0m0.100s
sys     0m0.030s

awk, grep olarak derlenmiş bir c-kod programı olduğu için yorumlanmış bir programlama dilidir (ek olarak dosyalarda desen bulmak için optimize edilmiştir).

(Not - Her iki komutu da iki kez çalıştırdım, böylece önbelleğe almanın sonuçları eğriltmemesi gerekir)

Vikipedi'de yorumlanmış diller hakkında daha fazla bilgi .

Stephane'nin yorumlarda haklı olarak belirttiği gibi, kullandığınız grep ve awk'nin uygulanması, üzerinde çalıştığı işletim sistemi ve işlediğiniz karakter kümesi nedeniyle kilometreniz değişebilir.


2
Hangi grep veya awk uygulamasını kullandığınızı ve hangi bilgisayar mimarisini ve hangi sistem karakter kümesini kullandığınızı söylemeden, bu zamanlamaların çok az değeri vardır.
Stéphane Chazelas

1
ikinci komut yeni önbelleğe alınan sürümü de kullanır. Grep'in daha hızlı olduğundan, sayılarınızın gösterdiği kadar değil olduğundan şüphem yok.
exussum

(dolayısıyla awk, grep, awk, grep çalıştırıyor ve awk ve grep'in ikinci kümesinden sonuçları yayınlıyoruz :) ve FYI, UTF8 yerel ayarında yaşıyorum.
Drav Sloan

1
BSD araçlarıyla (Mac'te) yeterince komik olan awk (31.74s), sed'den (33.34s) biraz daha hızlıdır, bu da grep'ten (34.21s) biraz daha hızlıdır. Gnu awk 5.24'lerde hepsine sahip, test etmek için gnu grep veya sed yok.
Kevin

1
grep biraz daha hızlı olmalıdır, çünkü awk her girdi satırında sadece bir regexp aramaktan daha fazlasını yapar, örneğin kodda bir alana başvurulursa (bu durumda değil) awk her girdi satırını alan-ayırıcı değeri ve yerleşik değişkenleri doldurur. ancak yayınladığınız şeyle neredeyse hiçbir fark olmamalıdır. Bugüne kadar awk belirli alanlarda arama ve böylece daha hassas ve daha az yanlış eşleşmeleri sağlayabilir ise grep ve awk wrt eşleştirme regexp'ler arasındaki en önemli fark eşleşen bir dize için bu grep aramaları tüm çizgidir.
Ed Morton

14

En belirgin ve etkileyici aracı kullanın. Kullanım durumunuza en uygun araç muhtemelen en hızlısıdır.

Kaba bir rehber olarak:

  • bir alt dize veya regexp ile eşleşen satırlar mı arıyorsunuz? Grep kullanın.
  • basitçe sınırlandırılmış bir dosyadan belirli sütunları seçiyor musunuz? Kesme kullanın.
  • kalıp tabanlı sübstitüsyonlar yapmak veya ... diğer şeyler sed makul yapabilir? Sed kullanın.
  • yukarıdaki 3 veya printf biçimlendirmesi veya genel amaçlı döngüler ve dalların bir kombinasyonuna mı ihtiyacınız var? Awk kullanın.

perlBunun yerine +1 hariç awk. grep / cut / sed'den daha karmaşık bir şeye ihtiyacınız varsa, şansınız awk yeterli olmayacak ve "tam
gelişmiş

@sds neden python olmasın
RetroCode

@RetroCode: python perl'den daha "genel amaçlı" dır; eşdeğer bir astar muhtemelen daha uzun olacaktır.
sds

3
@sds no, metin işleme dışında bir şey yapmayacaksanız perl'e ihtiyacınız yok. awk, grep / cut / sed'den daha karmaşık metin işleme işleri için iyidir ve bonus olarak perl'den farklı olarak tüm UNIX kurulumlarında standart olarak gelir.
Ed Morton

10

Yalnızca dizeleri ve hız konularını ararken neredeyse her zaman kullanmalısınız grep. Büyüklük emirleri, awksadece kaba arama söz konusu olduğunda olduğundan daha hızlıdır .

kaynak sed, awk ve diğer Unix ayrıştırma araçlarının işlevsel ve performans farklılıkları

UTILITY    OPERATION TYPE      EXECUTION TIME     CHARACTERS PROCESSED PER SECOND
                               (10 ITERATIONS)
-------    --------------      ---------------    -------------------------------
grep       search only         41 sec.            489.3 million
sed        search & replace    4 min. 4 sec.      82.1 million
awk        search & replace    4 min. 46 sec.     69.8 million
Python     search & replace    4 min. 50 sec.     69.0 million
PHP        search & replace    15 min. 44 sec.    21.2 million

1
Tüm bu programlara bu güzel bakış için teşekkürler. Karanlıkta gerçekten ışık tutuyor.
holasz

1
~ headtilt ~ PHP orada ama Perl değil mi?
Izkata

@Izkata - Bu tabloyu bir süre önce gördüğümde aynı şeyi düşündüm.
slm

1
Grep'in sadece aradığı ve aynı zamanda değiştirdiği diğer araçlar için gerçekten adil değil.
Kevin

1
Bunlar tamamen sahte numaralar. Elma ve portakal karşılaştırma hakkında konuşun - bu olabilir demek gibi sadece bir fiyat pazarlık, bir kredi almak ve böylece 1 saat içinde B sitesinde araba satın, bir araba bulabilirsiniz oysa 5 saniye içinde web sitesi A yeni bir araba bulmak bu nedenle A sitesi B sitesinden daha hızlıdır. Alıntıladığınız makale, grep, sed ve awk arasındaki göreceli yürütme hızı ifadelerinde tamamen yanlıştır ve ayrıca awk ... has PCRE matching for regular expressionshangisinin tamamen yanlış olduğunu da söyler .
Ed Morton

5

Teoride , uygulamada YMMV'den grepdaha hızlı olması gerektiğine awkkatılırken, kullandığınız uygulamaya çok bağlıdır.

burada, Debby / Linux 7.0 amd64'de (glibc 2.17 ile) 2.5M satırlık bir UTF-8 yerel ayarında meşgul kutusu 1.20.0'ın grep ve awk, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 Yalnızca ASCII karakterleri.

$ time busybox grep error error | wc -l
331003
busybox grep error error  8.31s user 0.12s system 99% cpu 8.450 total
wc -l  0.07s user 0.11s system 2% cpu 8.448 total
$ time  busybox awk /error/ error | wc -l
331003
busybox awk /error/ error  2.39s user 0.84s system 98% cpu 3.265 total
wc -l  0.12s user 1.23s system 41% cpu 3.264 total
$ time  grep error error | wc -l
331003
grep error error  0.80s user 0.10s system 99% cpu 0.914 total
wc -l  0.00s user 0.11s system 12% cpu 0.913 total
$ time mawk /error/ error | wc -l
330803
mawk /error/ error  0.54s user 0.13s system 91% cpu 0.732 total
wc -l  0.03s user 0.08s system 14% cpu 0.731 total
$ time gawk /error/ error | wc -l
331003
gawk /error/ error  1.37s user 0.12s system 99% cpu 1.494 total
wc -l  0.04s user 0.07s system 7% cpu 1.492 total
$ time 

C yerel ayarında, sadece GNU grep önemli bir destek alır ve daha hızlı olur mawk.

Veri kümesinin, normal ifadenin türü de büyük bir fark yaratabilir. Regexps için awkkarşılaştırılması gereken grep -Eşekilde awkbireyin regexpleri genişletilmiş RE bulunmaktadır.

Bu veri kümesi için, varsayılan ve varsayılan yerel ayar UTF-8 tabanlı (IIRC, Ubuntu'da olduğu gibi) meşgul kutusu tabanlı sistemlerden veya sistemlerden awkdaha hızlı olabilir .grepmawkawk


2

Özetle, grepbir şey sadece diğer UNIX araçları kadar bir şey yapar ve bu, bir çizgiyi verilen desene eşleştirir ve bunu iyi yapar. Öte yandan, awkPOSIX standardı tarafından tanımlanan, değişkenler, diziler, ifadeler, işlevler veya desen tarama ve işleme için kontrol ifadeleri gibi tipik özelliklere sahip eksiksiz bir programlama dili olduğu için daha karmaşık bir araçtır.

Bence, desen eşleşmesi durumunda her iki aracın nasıl performans gösterdiğine ve işlemek istediğiniz bazı girdilerin boyutuna bağlıdır. Ben grep genellikle sadece eşleştirme yaptığı gibi awk daha verimli olmasını beklenir. Ancak diğer araçları kullanmadan eşleşen kayıtların, hesaplamaların veya baskı sonuçlarının daha fazla işlenmesi gibi daha karmaşık görevleri gerçekleştirmek için grep ile basit bir kod yazamazsınız.

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.