AWK'yi öğrenmek için hala herhangi bir sebep var mı?


109

Sürekli yeni araçlar öğreniyorum, eski moda olanlar bile, çünkü problem için doğru çözümü kullanmayı seviyorum.

Yine de, bazılarını öğrenmek için hala bir sebep var mı merak ediyorum. awkÖrneğin bana ilginç olmakla birlikte, basit metin işleme, ben kullanabilir grep, cut, sedvb karmaşık olanlar için, ben Python için gidersiniz iken.

Şimdi bunun güçlü ve kullanışlı bir araç olmadığını söylemiyorum. Ancak yeni bir araç öğrenmek zaman ve enerji gerektirdiğine göre , buna değer mi ?


2
2019 ve ben sadece awk'de bir python günlük normalleştiricisini yeniden yazdım. Dönüşümü, 54 milyon satır günlük dosyası (~ 9GB) olan bir haftalık günlük dosyasında çalıştırdım. Macbook Pro'mda (2.8 GHZ i7, 16 GB Ram), python sürümü saniyede ~ 10.000 satır işleyebilir => 90 dakika çalışma süresi. Mawk kullanarak çalışma süresi 2 dakikaya düşürüldü. Btw, awk programı yarı boyutundaydı.
mistahenry

@mistahenry pypy denedin mi?
qwr

Yanıtlar:


97

Kendinizi içinde bulduğunuz ortama bağlı olduğunu düşünüyorum. Eğer bir * nix kişiyseniz, o zaman bilmek awkİyi bir Şeydir. Neredeyse her * nix'te bulunabilen diğer tek komut dosyası ortamı sh. Bu yüzden grep, sed,vb. Kesinlikle awkmodern bir ana akım linuxdağıtımın yerini alabilirken , daha egzotik sistemlere geçtiğinizde, biraz awkbilginin Real Handy olacağını bilirsiniz .

awkmetin işlemeden daha fazlası için de kullanılabilir. Örneğin, danışmanlarımdan biri astronomi kodunu yazıyor awk- bu ne kadar eski kafalı ve harika biri. O günlerde, iş için en iyi araçtı ... ve şimdi öğrencileri benim gibi piton kullansa da kullanmasa da, bildiği şeye bağlı kalıyor ve iyi çalışıyor.

Bitirirken, biraz awkzarar vermeyeceğini bilerek dünya çapında birçok eski kural tekmeliyor . Ayrıca sizi daha iyi hale getirecek * nix person :-)


12
++ Kabul edildi, awk gerçekten * nix araç setindeki en taşınabilir ve en önemlisi tutarlı araçlardan biridir. Örneğin perl'in hiçbir yerde bulunmadığı meşgul kutusunda güvenilir şekilde çalışır.
guns

1
Dilleri süslemeye alışkınsanız öğrenmek o kadar da zor değil
guns

2
"Her ortamda aynıdır" - tam olarak değil: Windows altında tek tırnaklar çift ile değiştirilmeli, s ve dahili çiftler önlenmelidir. (Kendinizi Redmond'un güvensiz yarı bitmiş zulmüne maruz bırakmak sizi 15 yaşındaki herhangi bir Rus'un insafına bıraksa bile, Windows gerçek bir ortamdır).
GT.

6
Pek çok insanın aynı evrende awk ve pencerelerin varlığını ilişkilendirdiğini sanmıyorum .....: P
FoldedChromatin

2
Metin işleme işleri için hala awk kullanılıyor. Genellikle başka bir şeyde (yakut, python) bir komut dosyası başlatacağım ve basitlik ve güç için awk'a geri döneceğim.
Rumbleweed

104

Awk'nin temellerini çabucak öğrenirseniz, komut satırında gerçekten harika şeyler yapabilirsiniz.

Ancak awk'ı öğrenmenin gerçek nedeni , yazarları Aho, Kernighan ve Weinberger tarafından yazılan muhteşem The AWK Programming Language kitabını okumak için bir bahaneye sahip olmaktır . İsminden, size sadece awk öğrettiğini düşünürdünüz. Aslında bu sadece başlangıç. Dize manipülasyonunu kolaylaştıran kısa ve öz bir betik dili kullanıldığında, çözülebilecek geniş bir dizi problemi başlatmak - ve awk ilklerden biriydi - okuyucuya bir veritabanının, bir ayrıştırıcının, bir yorumlayıcının nasıl uygulanacağını öğretmeye devam eder. ve (eğer bellek bana hizmet ediyorsa) projeye özgü küçük bir bilgisayar dili için bir derleyici! Keşke awk kullanarak örnek bir işletim sistemi programlamış olsalardı, kitap bilgisayar bilimine oldukça eksiksiz bir anket girişi olacaktı!

Orijinal C Dili kitabı gibi, meşhur net ve özlü, aynı zamanda doğru yapılmış dostane teknik yazımın harika bir örneğidir. Dizin bile bir zanaatkarlıktır.

Awk? Biliyorsanız, ara sıra komut satırında kullanacaksınız, ancak daha büyük herhangi bir şey için kapana kısılmış hissedeceksiniz, sisteminizin daha geniş özelliklerine ve Python gibi bir şeyin erişim sağladığı İnternet'e erişemeyeceksiniz. Ama kitap? Her zaman okuduğunuza sevineceksiniz!


5
+1 Satıldı. Bu kitabı sipariş edeceğim. Awk'ı hızlı ve güçlü tek satırlık bir betik dili olarak yıllardır kullandım. Awk, aksi takdirde kodlanması bir düzine satır gerektiren dosyalar için harika bir ön işlemcidir. Şu formu kaç kez kullandığımı
sayamıyorum

2
Kabul. Neredeyse bu kitaba içerdiği her şeyin ne kadar kompakt olduğu inancına meydan okuyor. 1/10 (?) Uzunluğundaki çoğu çağdaş kitaptan daha fazlasını kapsar.
kil

3
Şu anda bu kitabı okuyorum ve bu, awk'a olan coşkumu neredeyse bir takıntıya dönüştürdü.
galaxywatcher


1
Sadece ilk bölümü okudum. Bu harika. Gizem çözüldü.
vaichidrewar

29

Kullanmamın tek nedeni awkotomatik bölme:

awk '{print $3}' < file.in

Bu, içindeki üçüncü boşlukla sınırlanmış alanı yazdırır file.in. Şundan biraz daha kolay:

tr -s ' ' < file.in | cut -d' ' -f3

3
neden awk '{print $3}' < file.inyerine kullanalım awk '{print $3}' file.in? Awk, bağımsız değişken olarak iletildiğinde dosyaları zaten okumuyor mu?
mbigras

@mbigras Elbette, awk'ı her iki şekilde de kullanabilirsiniz.
Greg Hewgill

Doubleize ile bile, awk olmayan çözümü seviyorum. Ve neden nefret ettiğimi bilmiyorum awk: /
MD. Mohiuddin Ahmed

25

Dosyanız sütunlar / alanlar içeriyorsa awk'nin harika olduğunu düşünüyorum . Çok sütunlu bir dosyadaki belirli bir sütunu işlerken / analiz ederken kullanıyorum. Veya belirli bir sütunu / sütunları eklemek / silmek istersem.

Örneğin

awk -F \t '{ if ($2 > $3) print; }' <filename>

yalnızca sekmeyle ayrılmış dosyadaki 2. sütun değeri 3. sütun değerinden büyükse yazdırılır.

Elbette Perl veya Python kullanabilirim, ancak awk, kısa ve öz bir tek satır komutuyla bunu çok daha basit hale getirir.

Ayrıca awk öğrenmek oldukça düşük maliyetlidir. Awk ile ilgili temel bilgileri bir saatten daha kısa bir sürede öğrenebilirsiniz, bu nedenle bu, diğer herhangi bir programlama / komut dosyası dilini öğrenmek kadar çaba gerektirmez.


Çok fazla kullanmasam da bu awk için harika bir kullanım.
Paul Nathan

8

HTML ile uğraşmak için zaman zaman AWK kullanıyorum. Örneğin, bu kod tabloları csv dosyalarına çevirir:

BEGIN {s=""; FS="n"}
/<td/ { gsub(/<[^>]*>/, ""); s=(s ", " $1);}
/<tr|<TR/ { print s; s="" }

Ekran kazıma yapıyorsanız bu harika. Aslında, AWK'yi sevdiğimden biri olabilir çünkü sorunlara çok hızlı bir şekilde yanlış çözümü geliştirmeme izin veriyor :) daha fazla örnek . Ayrıca Jon Bentley'in sevimli Programlama İncilerinde de bahsedilmiştir .


7

Çok sık awk kullanıyorum. Bir boru hattının ortasında çok basit metin karıştırma için iyidir; Hiç ihtiyaç duymama ile Perl / Python / her neyse onu kırbaçlama ihtiyacı arasında çok dar bir boşluğu doldurur.

Çok fazla zaman harcamanızı tavsiye etmem, ancak sözdiziminin temellerini bilmek işe yarayabilir - en azından, kullanmak istediğinizde el kitabına hızlı bir şekilde başvurabilmeniz için yeterli.


5

Çoğu awk one gömlekleri Perl one gömlekleri ile elde edilebilir - eğer Perl one liner zihniyetine girmeyi seçerseniz. Veya Perl üç gömlek kullanın :)

Awk'ı seven biri tarafından yazılmış kabuk betikleri tutuyorsanız, o zaman açıkça awk öğrenmeniz gerekecek.

Pratik bir ihtiyaç olmasa bile, regex'i zaten biliyorsanız, temelleri kavramanız uzun sürmez ve o zamanlar işlerin nasıl tasarlandığını görmek eğlencelidir. Oldukça zarif.


5

Bu soruyu sorduktan 6 yıl sonra şimdi kesin olarak cevaplayabilirim: hayır, awk öğrenmek buna değmez.

Temel görevler, ancak basit bash komutları ve hatta GUI araçlarıdır. Python (favori veya benimki) veya Ruby gibi modern dinamik dillerle daha karmaşık görevlerin üstesinden kolaylıkla gelinecektir.

Size pek çok görevde (web, admin, data crunching, otomasyon, vb.) Yardımcı olacağı için kesinlikle bir mordern betikleme dinamik dili öğrenmelisiniz. Ve böyle yaparak awk gibi bir araç tamamen işe yaramazsa, her ay en iyi ihtimalle birkaç saniye kazandıracaktır.


2
Mutlaka doğru değil. Gerçekten büyük dosyaları ayrıştırıyorsanız, diğer araçlardan çok daha hızlı olabilir.
user1071847

İlginç çünkü bundan birkaç yıl sonra hala awk hakkında sorular soruyorsunuz. İlk yanıt verenlerden
biriydim

4

Sed'i zaten biliyorsanız ve kullanıyorsanız, en azından biraz awk da alabilirsiniz. Oldukça güçlü numaralar için bir araya getirilebilirler. Her zaman izleyiciyi etkiler.


4

Computerworld geçtiğimiz günlerde AWK'nın üç yaratıcısından biri olan Alfred V. Aho ile AWK hakkında bir röportaj yaptı . Oldukça ilginç bir okuma. Belki de içinde bazı ipuçları bulacaksınız, AWK öğrenmek neden iyi bir fikirdir.


Güzel, ama beni ikna etmedi. AWK çok iyi bir araçtır, ancak çözümümü sed veya python'da hacklemek yerine onu öğrenmek için asla yeterli zamana ihtiyacım olmayacağını düşünüyorum.
e-satis

4

Ne Perl ne de diğer birçok betik dilinin kurulu olmadığı gömülü bir Linux sistemi üzerinde çalışan son sözleşmemde AWK öğrenmek benim için çok değerliydi.


2
9 yıl sonra ve bugün git günlüklerini toplarken çokça awk kullandım
Dexygen

3

awk çok iyi bir yardımcı / zorluğa sahiptir ve "basit awk" her Unix / Linux / MacOS'ta çalışır (ve diğer sistemlere de kurulabilir).

Altın Çağda, insanlar yazmaktan nefret ettiklerinde tasarlandı, bu nedenle senaryolar çok, çok kısa ve hızlı yazılabilir. Hızlı bir versiyon olan mawk'ı kurmaya çalışacağım, iddiaya göre hesaplamayı yaklaşık 9 kat hızlandırıyor, awk / gawk oldukça yavaş, bu yüzden R yerine kullanmak istiyorsanız mawk isteyebilirsiniz.


2

Çoğunlukla, kabuk komut dosyası oluştururken günlük dosyalarını veri veya program çıktıları için ara sıra ayrıştırmak zorunda kalırsanız kullanışlıdır, çünkü awk ile python'da biraz daha fazla kod satırı alacak olanı elde etmek çok kolaydır.

Kesinlikle bundan daha fazla güce sahip, ancak bu, çoğu insanın onu kullandığı görevler gibi görünüyor.


2

Elbette: Mevcut tek dillerin olduğu bir ortamda çalışıyorum: (COBOL, OMG, OMG üreten bazı kötü diller), bash (eski sürüm), perl (henüz ustalaşmıyorum), sed, awk ve diğer bazı komut satırı yardımcı programları. Bilmek awkbeni birkaç saat kurtardı (ve meslektaşlarımdan birkaç metin işleme görevi oluşturmuştu - günde en az üç kez bana geliyorlar).


1

Muhtemelen artık buna değmediğini söyleyebilirim. Zaman zaman, arama yeteneklerinin dahil olduğu sed'den çok daha çok yönlü bir akış editörü olarak kullanıyorum, ancak python konusunda yetkinseniz, gereken zamanı telafi etmek için çok daha hızlı bitirebileceğiniz bir görevi bilmiyorum. awk öğrenmek için.

Aşağıdaki komut muhtemelen son iki yılda awk kullandığım tek komuttur (yarı kaldırılmış paketleri Debian / Ubuntu sistemlerimden temizler):

$ dpkg -l|awk '/^rc/ {print $2}'|xargs sudo dpkg -P

1

Hayır!

İlginç olsa da, awk'ın yapabileceği her şeyi Perl gibi daha güçlü araçları kullanarak yapabilirsiniz.

Zamanınızı bu daha güçlü araçları öğrenerek geçirin - ve sadece tesadüfen yol boyunca bazı garip şeyler alın.


1

Var diyebilirim. Basit şeyler için, AWK deneyimsiz sistem yöneticisi / geliştirici için Python'dan çok daha kolaydır. Biraz AWK öğrenebilir ve pek çok şey yapabilirsiniz, Python öğrenmek yepyeni bir dil öğrenmek demektir (evet, AWK'nın da bir anlam olduğunu biliyorum).

Perl, AWK'nin yapabileceği pek çok şeyi yapabilir, ancak bu gün ve bu çağda ben burada Python'u seçerdim. Yani evet, AWK öğrenmelisiniz. ama Python da öğren :-)


1

awkbir powertool dilidir, bu nedenle awk, herhangi bir türden bir BT uzmanıysanız, muhtemelen bir yerlerde kullanıldığını göreceksiniz. Eğer söz dizimi ve düzenli ifadeler işleyebilir grepve seddaha sonra herhangi bir sorun toplayıp olmalıdır awkve muhtemelen değerli olduğunu.

awkGerçekten parlak bulduğum yer , çok satırlı kayıtları işleme ve aynı anda birden çok dosyayı karıştırıp / enterpolasyon yapma gibi şeyleri basitleştirmek.


0

Artık PERL hemen hemen her önemli platforma taşındığına göre, buna değmediğini söyleyebilirim. Sed ve awk'den daha çok yönlüdür. Otomatik bölmeye gelince, bunu perl'de şu şekilde yapabilirsiniz:

perl -F':' -ane 'print $F[3],"\n";' /etc/passwd

DÜZENLEME: awk ile biraz daha tanışmak isteyebilirsiniz , çünkü diğer bazı araçlar, model tabanlı eylemler felsefesine dayanmaktadır (örneğin, Solaris üzerinde DTrace).


0

Dosyaların sütun formatında olduğu alanda çalışıyorum. Bu yüzden awk, dosyayı yeniden biçimlendirmek benim için çok değerli, böylece farklı yazılımlar birlikte çalışabilir. BT dışı meslekler için awk kullanmak yeterli ve mükemmeldir. Şimdi bir gün, bilgisayar hızı bir sorun değil, bu yüzden awk ve unix'i bir çok 1 astar komutunu bir "betik" içine yönlendirmek için birleştirebilirim. Alana ve kayda göre Awk arama ile, dosyayı açmak için "vi" yerine dosya verilerini çok hızlı kontrol etmek için kullanıyorum. Awk yeteneğinin özellikle işime neşe getirdiğini söylemeliyim, iş arkadaşıma awk kullanarak işleri hızlı bir şekilde çözmesi için yardımcı olabilirim. Benim için harika bir kod.


0

Son zamanlarda ağ pcap dosyalarını 20Gbs'yi aşan bir DOS saldırısını günlüğe kaydederek görselleştirmeye çalışıyordum. Zaman damgasına ve IP adreslerine ihtiyacım vardı. Benim senaryomda, AWK one-liner inanılmaz ve oldukça hızlı çalıştı. Çıkarılan dosyaları temizlemek, IP adreslerini ve bu IP adreslerinden toplam paket sayısını gruplanmış bir zaman aralığı içinde almak için özellikle AWK kullandım . Başkalarının yukarıda yazdıklarına tamamen katılıyorum. Bu sizin ihtiyaçlarınıza bağlıdır.


0

Awk öğrenilmemesinin bir nedeni, normal ifadelerde açgözlü olmayan eşleşmelerin olmamasıdır.

Şimdi yeniden yazmam gereken bir awk kodum var, çünkü aniden awk / gawk'ta açgözlü olmayan eşleşmeler diye bir şey olmadığına dair hata ayıkladım, bu yüzden bazı regex'leri düzgün bir şekilde çalıştıramıyorum.


0

Takım arkadaşlarınıza, liderinize ve üzerinde çalıştığınız göreve bağlıdır.

if( team mates and leader ask to write awk ){
  if( you can reject that){
    if( awk code is very small){
      learn little just like learn Regex
    }else{
      use python or even java
    }
  }else{
    do as they ask
  }
}

0

Şu anda python'da biraz kodlama yapıyorum. Ancak yine de basit bir dosya dönüşümleri için kolayca kullanacak kadar iyi bilmiyorum.

Awk ile hızlı bir şekilde unix komut satırında oldukça hızlı dönüşümler yapan tek satırlık bir kod parçası geliştirebilirim. Awk'ı her kullandığımda, yazdığım kod parçası tek kullanımlık olacak ve birkaç satırdan uzun olmayacak. Belki bir "eğer" ifadesi ve "printf" ifadesi burada veya orada tek satırda olabilir.

Awk ile 10 satırdan uzun bir kod parçası yazmadım. Yıllar önce bu tür senaryolar görmüştüm.

Ancak birçok satır kod gerektiren herhangi bir şey, python'a başvururdum.

Awk seviyorum. Sed ile birlikte çok güçlü bir araçtır.

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.