Perl, Python, AWK ve sed arasındaki farklar nelerdir? [kapalı]


254

sadece aralarındaki temel farkların neler olduğunu bilmek ister misiniz? ve her dilin gücü (kullanmanın daha iyi olduğu yerlerde).

Düzenleme: "vs." değil konu gibi, sadece bilgi.


143
Bu tür yapıcı olmayan sorular gerçekten yararlıdır.
Buhar

10
Tabii, onları bulmak için ön sayfada bir sekme kullanışlı olurdu ...

Python'un komut satırındaki kullanışlılığı için bkz. Pyp
Neil McGuigan

Yanıtlar:


550

Görünüş sırasına göre dillerdir sed, awk, perl, python.

sedProgram bir akış düzenleyici olup, giriş dosya veya dosyalar (çizgilerin belirtilen aralıklara, veya daha genel olarak), her hat için bir komut işlemleri uygulamak için tasarlanmıştır. Dili, edUnix editörüne dayanır ve şartlı olmasına rağmen, karmaşık görevler için çalışmak zordur. Bununla birlikte küçük mucizeler yaratabilirsiniz - ancak başınızdaki saçlara bir maliyetle. Ancak, görev alanı içindeki görevleri denerken muhtemelen programların en hızlısıdır. (Tartışılan programların en az güçlü düzenli ifadelerine sahiptir - birçok amaç için yeterlidir, ancak kesinlikle PCRE değil - Perl Uyumlu Düzenli İfadeler)

awkProgram (yazarlarının baş harflerini adı - Aho, Weinberger ve Kernighan) raporlarını biçimlendirme için başlangıçta bir araçtır. Çorba gibi kullanılabilir sed; daha yeni sürümlerinde, hesaplama tamamlandı. İlginç bir fikir kullanıyor - program 'eşleşen modeller' ve 'desen eşleştiğinde alınan eylemlere' dayanıyor. Desenler oldukça güçlüdür (Genişletilmiş Düzenli İfadeler). Eylemlerin dili C'ye benzer. Temel özelliklerinden biri awk, girdiyi otomatik olarak kayıtlara ve her kaydı alanlara ayırmasıdır.

Perl kısmen bir garip-katil ve sed-katil olarak yazılmıştır. Birlikte verilen programlardan ikisi a2pve betikleri ve betikleri Perl'e s2pdönüştürmektir . Perl, yeni nesil kodlama dillerinin en eskilerinden biridir (Tcl / Tk muhtemelen öncelikli olduğunu iddia edebilir). Çok daha güçlü bir dille güçlü entegre düzenli ifade işleme özelliğine sahiptir. Neredeyse tüm sistem çağrılarına erişim sağlar ve CPAN modüllerinin genişletilebilirliğine sahiptir. (Ne genişletilebilir ne de .) Perl'in sloganlarından biri "TMTOWTDI - Bunu yapmanın birden fazla yolu var" ("tim-toady" olarak telaffuz edilir). Perl'in 'nesneleri' vardır, ancak dilin temel bir parçası olmaktan çok bir eklentidir.awksedawksed

Python en son ve muhtemelen kısmen Perl'e tepki olarak yazılmıştır. Bazı ilginç sözdizimsel fikirleri vardır (seviyeleri belirtmek için girintileme - diş telleri veya eşdeğerleri yok). Perl'den daha temelde nesne yönelimlidir; Perl kadar genişletilebilir.

Tamam - ne zaman kullanılır?

  • Sed - dosyalar üzerinde basit metin dönüşümleri yapmanız gerektiğinde.
  • Awk - sadece basit biçimlendirme ve özetleme veya veri dönüşümüne ihtiyacınız olduğunda.
  • Perl - hemen hemen her görev için, ancak özellikle görev karmaşık düzenli ifadelere ihtiyaç duyduğunda.
  • Python - Perl'i kullanabileceğiniz aynı görevler için.

Perl'in Python'un yapamayacağı hiçbir şeyin farkında değilim, ya da tam tersi. İkisi arasındaki seçim diğer faktörlere bağlı olacaktır. Perl'i bir Python olmadan önce öğrendim, bu yüzden kullanmaya eğilimliyim. Python daha az sözdizimine sahiptir ve genellikle öğrenilmesi biraz daha kolaydır. Perl 6, piyasaya çıktığında büyüleyici bir gelişme olacak.

(Özellikle Perl ve Python'un 'genel bakışlarının' acımasızca eksik olduğunu unutmayın; tüm kitaplar konuyla ilgili yazılabilir.)


82
A ++++ yayını tekrar okurdu!
Robert Gamble

24
harika özellikle "ne zaman her kullanacağım" bölümü
Khaled Al Hourani

6
Python zen temelde TMTOWTDI antitezi olduğunu unutmayın, bu yüzden perl bir tepki olabilir söyleyebilirim. iirc TCL perl'den biraz sonraydı ve perl'e karşı oldukça gericiydi, ancak TCL reaksiyonu sözdizimi ve dil karmaşıklığındadır, bir şeyler yapmanın yolları değil
jk.

7
Orijinal niyet ne olursa olsun, daha sonra Python geliştirmesinin ve python topluluğunun Perl'in daha esnek ama kısa sözdizimine göre okunabilirliği ve tutarlılığı tercih ettiği açıktır. Mükemmel mesaj Jonathan
Martin Beckett

4
@blasto: ETL için, ben öncelik ediyorum awküzerinde sed(her ikisi hala kullanımları vardır gerçi) öğrenmek için. Görevin boyutuna gelince: sedbir seferde bir satır işlerken, satırdan satıra depolama olmadan en iyisidir. awkgenellikle tüm kaynaklardan toplanan verilerle ilişkilendirilebilir diziler oluşturmak için kullanılır; daha fazla bellek kullanır ve bu nedenle büyük veri kümelerinde olduğundan daha fazla sorunla karşılaşma olasılığı daha yüksektir sed. tsawkBağlantı kurmadan önce duymadım . Bir görev çok fazla olduğunda Perl'e geri dönme eğilimindeyim (ancak Python ile daha iyisini yapabilirsiniz) awk.
Jonathan Leffler

91

Birkaç düzine dilde ustalaştıktan sonra, S. Lott gibi insanlardan bıktınız (bu soruya tartışmalı cevabına bakın, cevapladıktan altı yıl sonra (+ 45 / -22) aşağı oyların neredeyse yarısı (+ 45 / -22).

Sed, son derece basit komut satırı boru hatları için en iyi araçtır. Bir sed ustanın elinde, keyfi karmaşıklığın bir defalık için uygundur, ancak çok basit ikame boru hatları hariç üretim kodunda kullanılmamalıdır. 'S / this / that /' gibi şeyler.

Gawk (GNU awk), yalnızca tek bir giriş kaynağı ve tek bir çıktı (veya sırayla birden fazla çıktı yazıldığında) karmaşık veri yeniden biçimlendirme için açık ara en iyi seçimdir. Çok sayıda gerçek dünya çalışması bu tanıma uyduğundan ve iyi bir programcı gawk'yi iki saat içinde öğrenebildiğinden, en iyi seçimdir. Bu gezegende, daha basit ve daha hızlı daha iyidir!

Çok karmaşık giriş / çıkış senaryolarınız olduğunda Perl veya Python, awk veya sed'in herhangi bir sürümünden çok daha iyidir. Sorun ne kadar karmaşıksa, bakım ve okunabilirlik açısından python'u o kadar iyi kullanırsınız. Bununla birlikte, iyi bir programcının herhangi bir dilde okunabilir kod yazabileceğini ve kötü bir programcının herhangi bir yararlı dilde sürdürülemez bok yazabileceğini unutmayın, bu nedenle perl veya python seçiminin, söz konusu programcı olması durumunda programcının tercihlerine güvenli bir şekilde bırakılabileceğini unutmayın. yetenekli ve zeki.


9
% 100 kabul etti. En iyi bilmek, tüm araçlar olmasa VE her birinin ne zaman kullanılacağı iyi bir teknisyeni vasat olandan ayıran şeydir.
ata

6
Ben awk yerine Python veya Perl seçmek için başka bir neden dönüşüm gereksinimleri karmaşık bir doğrulama veya başka bir dilin mevcut, sağlam bir modül olduğu mantık içerir olmasıdır. Örneğin e-posta veya sokak adreslerini awk olarak düzgün bir şekilde ele almanın ne olacağını düşünün ve ne demek istediğimi göreceksiniz: perl ve python'un bu önemsiz şeyleri yapan kütüphaneler var, awk'de bunlar nadir veya kullanılamaz.
sorpigal

3
Aslında Perl'in hem Sed hem de Awk'ı kapsayacak şekilde tasarlandığı gibi; Sed veya Awk öğrenmek yerine Perl dilinde yazmayı daha kolay buluyorum.
Brad Gilbert

@BradGilbert: Ben sadece üst cevapta bahsettiğim gibi, Perl (& Python, ruby, vb.) Awk üzerinden bir uyarı, bir tür normal ifade reaaaaaaaaaally öncekinde daha yavaş olmasıdır: swtch.com/~rsc/regexp/regexp1.html
Olivier Dulac

1
@OlivierDulac Evet, patolojik bir durum gösteriyor. Bunu değiştirmek a?ⁿaⁿiçin a??ⁿaⁿPerl 5'te 1.000.000'luk bir değerle iki saniyeden daha kısa sürede çalışır. time perl -E '$x=1_000_000;$_="a"x$x;$m=("a??"x$x).("a"x$x);say $_=~$m'Eğer naif olanı çalıştırırsanız sadece 25 saniyeden daha uzun bir süre alır . Fark etmeniz gereken şey Perl'in, eşleşen olanı değiştiren normal ifadenin içinde Perl koduna sahip olmanıza izin vermek de dahil olmak üzere daha hızlı olanlardan daha fazla regex özelliğine sahip olmasıdır. . İsterseniz, diğerlerinden biri için yerleşik olanı değiştiren bir modül uygulayabilirsiniz.
Brad Gilbert

21

Sed'e tam teşekküllü bir programlama dili demezdim, metin dosyalarını programlı olarak düzenlemeyi amaçlayan dil yapılarına sahip bir akış düzenleyicisidir.

Awk genel amaçlı bir dilden biraz daha fazlasıdır, ancak yine de metin işleme için en uygunudur.

Perl ve Python tam teşekküllü genel amaçlı programlama dilleridir. Perl'in metin işlemede kökleri vardır ve bir dizi awk benzeri yapıya sahiptir (nette yüzen bir awk-perl betiği bile vardır). Perl ve Python arasında birçok fark var, en iyi bahsiniz muhtemelen her iki dilin özetlerini Wikipedia gibi bir şeyde okumak ve ne olduklarını iyi kavramaktır.


2
Turoban Tamamlama anlamına gelen Sokoban'ın sed uygulamasını gördüm. Bununla birlikte, sendmail.cf ve TeX için de söylenebilir.
ConcernedOfTunbridgeWells

7
Lazer yazıcıyı yönlendiriciye dönüştürmek için PostScript yazan bir adamla çalıştım.
Sam Kington

10
@Sam: Vay canına! Bir yazıcının lazerinin odun kesecek kadar kranklanabileceğini bilmiyordum! Üzgünüm yanlış yönlendirici.
sonraki duyuruya kadar duraklatıldı.

2
sed, tam teşekküllü bir dil değil mi? Sed tam bir tur gibi, bu tamamen doğru değil ;)
bernard paulus

1
Ben dördüncü dilde awk olarak bir uygulama gördüm. (Awk kendi başına bir ayrıştırıcı olarak kabul edilebildiğinden, içinde bir tercüman uygulamak oldukça basittir).
Tatjana Heuser

19

İlk olarak, "Perl, Python awk ve sed" listesinde iki alakasız şey var.

Şey 1 - basit metin düzenleme araçları.

  • sed. Bir dosyanın her satırını okuma ve inceleme fikri ile tanımlanan sabit, nispeten basit bir çalışma kapsamına sahiptir. sed özellikle okunabilir olacak şekilde tasarlanmamıştır. Çok küçük unix sunucularında çok küçük ve çok verimli olacak şekilde tasarlanmıştır.

  • awk. Biraz daha az sabit, daha az basit bir çalışma alanına sahiptir. Bununla birlikte, bir awk programının ana döngüsü, bir kaynak dosyanın satırlarının örtülü olarak okunmasıyla tanımlanır.

Bunlar "tam" programlama dilleri değildir. - Bazı çalışmalarla - awk içinde oldukça karmaşık programlar yazabilirsiniz, ancak hızla karmaşıklaşır ve okunması zorlaşır.

Şey 2 - genel amaçlı programlama dilleri. Bunlar, çok çeşitli ifade türlerine, çok sayıda yerleşik veri yapısına sahiptir ve bahsetmek için kablolu varsayımlar veya kısayollar yoktur.

  • Perl.

  • Python.

Ne zaman kullanılır?

  • sed. Asla. 32K'dan fazla belleğe sahip modern bilgisayar çağında gerçekten bir değeri yoktur. Perl veya Python aynı şeyleri daha net yapar.

  • awk. Asla. Sed gibi, daha erken bir bilgisayar çağını yansıtır. Bu dili korumak yerine (başarılı bir sistem için gerekli olan diğer tüm dillere ek olarak), her şeyi tek bir hoş dilde yapmak daha hoştur.

  • Perl. Her türlü programlama problemi. Aynı şeyi yapmanın birçok, çok yolunun olduğu serbest düşünme sözdizimini seviyorsanız, perl eğlencelidir.

  • Python. Her türlü programlama problemi. Daha az seçenek, daha az incelik ve (belki de) daha fazla netliğin olduğu oldukça sınırlı sözdizimini seviyorsanız. Python'un nesneye yönelik yapısı onu büyük ve karmaşık problemler için daha uygun hale getirir.

Arka plan - Sed ve awk'ı cehaletten kurtarmıyorum. 20 yılı aşkın bir süre önce awk öğrendim. Onunla birçok şey yaptım; çekirdek unix becerisi olarak öğretirdi. Perl'i yaklaşık 15 yıl önce öğrendim. Onunla birçok sofistike şey yaptım. Her ikisini de geride bıraktım çünkü Python'da aynı şeyleri yapabilirim - ve daha basit ve daha net.

Sed ve awk ile ikisi de yaş olmayan iki ciddi sorun var.

  1. Uygulamalarının eksikliği. Sed ve awk'in yaptığı her şey Python veya Perl'de yapılabilir, genellikle daha basit ve bazen daha hızlıdır. Bir kabuk boru hattının çoklu işlemesi nedeniyle bazı performans avantajları vardır. Python, subprocessbu avantajları kurtarmama izin veren bir modül sunuyor .

  2. Başka bir dil öğrenme ihtiyacı. Python'da (veya Perl) bir şeyler yaparak uygulamanız daha az dile bağlıdır ve netlik artar.


66
Awk / sed'e karşı oldukça iğrenç argümanlar. Ayarlanabilir anahtar, sed ve awk hala aynı nedenden ötürü açık anahtarın yerini almamıştır. Bazen basit araç iş için en iyisidir. Çok fazla perl yazıyorum, ancak basit bir borulu komut zinciri için, awk / sed perl -e'den daha hızlı
RET

27
Çoğu linux olmayan unix sisteminde sh, sed ve awk dışında hiçbir şeyin kullanılabilirliğini kabul edemezsiniz. Hazır Solaris, HP / UX veya AIX kurulumunda bir şeyin çalışması istiyorsanız, sed ve awk ile sıkışıp kalırsınız.
ConcernedOfTunbridgeWells

27
Kabuk betiklerimin yarısı sed veya awk kullanıyor. Onlar ölümden çok uzaklar. Python tercih ettiğim komut dosyası dilidir, ancak bazen sed ve awk iş için en iyi araçtır. Uzun yıllardır kullanımda olmaları, eski oldukları anlamına gelmez.
Jeremy Cantrell

16
@ S.Lott: Herkesin awk içinde bir web uygulaması oluşturmaya çalışmasını önermiyorum, ama asla kullanılmaması gerektiğini söylemek biraz çirkin. Basit bir s & r ve / veya tweak (özellikle ayrılmış bir metin dosyasına) için, perl -e veya python -c bir sed / awk tek-astarı kadar verimli olmaz.
RET

25
Böyle cevapları sevmem. Sed ve awk, birkaç saat içinde anlaşılması kolaydır ve tam teşekküllü bir dilden çok daha hafif ve yaygın olarak bulunur. Kabuk programlama her zamanki gibi önemlidir, "HİÇBİR ZAMAN" bunu veya bu aracın basitçe geciktirildiğini söyler. Ancak, bu engelli fikir Perl'in ortaya çıktığı temellerden biri değil miydi? Oh well--
ata

15

Ne zaman kullanılır: awk - asla - S. Lott.

Sanırım S. Lott bu tavsiyeyle işareti hafifçe kaçırdı. Gerçek şu ki, Linux ve diğer UNIX ortamlarında awk, hızlı metin işlemleri için bash, sh ve ksh ile kullanılabilecek kullanışlı bir araçtır. Komut dosyası oluşturma fikri, bu aracı, o aracı bir araya getirerek sorununuzu çözmenizdir. Bu nedenle, yönetici komut dosyalarında, ls, grep, |, awk, zaman, ps vb. .

Örneğin ben paintball dişli malzemelerini yöneten ekibin bir üyesiyimdotcom. Bu e-ticaret sitesi LAMP yığınını temel alır. Çeşitli tedarikçilerden veri akışlarının arka uç veritabanına otomatik olarak işlenmesi ve normalleştirilmesi için, bash, perl, php ve hatta beklenti de dahil olmak üzere çok çeşitli komut dosyalarını kullanır ve koruruz. Her birinin mevcut modüllere ve API'ye dayanan güçlü yönleri vardır. Bash komut dosyalarında, awl kullanarak PERL'e geçmeye gerek kalmadan hızlı kalıp eşleşmesi ve kalıplar üzerinde uygun eylemler yapıyoruz. Ayrıca, iş parçacığında vurgulanmayan, işaret etmek istediğim bir şey, bu komut dosyalarının adil bir sayısının açık kaynaktan satın alınması veya elde edilmesidir. Senaryo Perl olarak geldiyse, Perl olarak devam ederiz; Senaryo Php olarak geldiyse, onu Php olarak koruyoruz; eğer bash olarak geldiyse, bash olarak koruyoruz;


7
brian d foy değil, alıntı yaptığınız cevabı yazan S.Lott oldu ...
plusplus

5
Bu oldukça eski cevabın yan notu olarak: çıkışını asla ayrıştırmayın, lsbunun yerine glob kullanın. Oku bunu.
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.