Sed ve awk arasındaki fark nedir? [kapalı]


497
  • Awk ve sed arasındaki fark nedir?
  • Sed ve awk araçları için en iyi kullanım alanları nelerdir?

2
Unix.stackexchange ile ilgili bir KG: grep, awk ve sed için temel bir öğretici var mı?
Dani

Yanıtlar:


549

sedbir akış düzenleyicisidir. Satır başına karakter akışlarıyla çalışır. Goto tarzı döngüler ve basit koşullara (desen eşleşmesine ve adres eşleşmesine ek olarak) sahip ilkel bir programlama diline sahiptir. Esasen sadece iki "değişken" vardır: örüntü alanı ve tutma alanı. Komut dosyalarının okunabilirliği zor olabilir. Matematiksel işlemler en iyi ihtimalle olağanüstü derecede gariptir.

sedKomut satırı seçenekleri ve dil özellikleri için farklı destek düzeylerine sahip çeşitli sürümleri vardır .

awksatır başına sınırlandırılmış alanlara yöneliktir. Bu da dahil olmak üzere çok daha sağlam programlama yapıları vardır if/ else, while, do/ whileve for(C giriş ve dizi tekrar). Değişkenler ve tek boyutlu ilişkilendirilebilir diziler artı (IMO) kludgey çok boyutlu diziler için tam destek vardır. Matematiksel işlemler C'deki ile benzerdir printf. "AWK" daki "K", " C Programlama Dili" ününün "Kernighan ve Ritchie" deki gibi " K ernighan " anlamına gelir ( A ho ve W einberger'i unutmamak için). Akla gelebilecek bir akademik intihal dedektörü yazılabilirdi awk.

GNU awk( gawk), en son sürümdeki gerçek çok boyutlu diziler de dahil olmak üzere çok sayıda uzantıya sahiptir. Diğer varyasyonları vardır awkdahil mawkve nawk.

Her iki program da metin seçmek ve işlemek için normal ifadeler kullanır.

sedMetinde kalıpların olduğu yerlerde kullanmaya eğilimliyim . Örneğin, "eksi işareti ve ardından bir rakam dizisi" (örn. "-231.45") biçimindeki bazı metindeki tüm negatif sayıları "muhasebecinin parantezleri" formuyla (örn. "(231.45)" değiştirebilirsiniz. ) bunu kullanarak (iyileştirilmesi gereken yerler vardır):

sed 's/-\([0-9.]\+\)/(\1)/g' inputfile

Ben kullanacağı awkmetin daha fazla satır ve sütun veya benzediği zaman, hem awk"kayıtları" ve "alanları" onlara karşılık gelir. Yukarıdaki gibi benzer bir işlem yapacak olsaydım, ancak basit bir virgülle ayrılmış dosyada yalnızca üçüncü alanda şöyle bir şey yapabilirdim:

awk -F, 'BEGIN {OFS = ","} {gsub("-([0-9.]+)", "(" substr($3, 2) ")", $3); print}' inputfile

Tabii ki bunlar, her birinin sunduğu tüm yetenekleri göstermeyen çok basit örneklerdir.


7
Sınırlarını zorlamanın bazı örneklerini görmek için sed: sed.sourceforge.net/#scripts
sonraki duyuruya kadar duraklatıldı.

@DennisWilliamson - Sadece awk öğrenirsem dezavantajlı mıyım? Awk sed'den çok daha sık mı kullanılıyor?
Buhar

4
@blasto: Benim tavsiyem ikisini de öğrenmektir ama awk üzerinde daha fazla durulacak. Düzenli ifade öğelerinin çoğu hem (hem de diğer araçlar ve diller) için geçerlidir. Daha basit şeyler için sed kullanın ve karmaşık şeylerden kaçınmaya çalışın. Sed'de döngüler ve dallar yapabilmeniz gerçekten harika, ancak ortaya çıkan komut satırları karmaşık ve okunması zor. Sorunuzun cevabı gerçekten ne yaptığınıza bağlıdır.
sonraki duyuruya kadar duraklatıldı.

@DennisWilliamson - Bir ETL geliştiricisi için en yararlı olan nedir? ETL veya Extract Transform and Load, veri ambarı terimidir. Kabaca söylemek gerekirse, iş farklı farklı kaynaklardan (DB'ler, excel dosyaları, csv dosyaları vb.) Verilerin EXTRACTION'ını, aynı şekilde dönüştürülmesini ve daha sonra analiz için bir veri yazılımına (DW) yüklenmesini, verilerde kalıpların bulunmasını veya sadece geçmişini içerir. kayıtları. Örneğin. Bir DW - Son 10 yıldaki verilere sahip bir bakkalın DW'sine uygulanan Algoritmalar, elma satın alma eğiliminde olan kişilerin de portakal veya benzer bir şey satın aldığını ortaya çıkarabilir.
Buhar

1
Mac'te bununla karşılaşan herkes için sadece bir FYI, ilk sed örneği için "sed -E 's / - ([0-9] +. [0-9] *) / (\ 1) / g'" yi deneyin.
Daniel Schmidt

124

1) awk ve sed arasındaki fark nedir?

Her ikisi de metni dönüştüren araçlardır. ANCAK awk sadece metin manipüle dışında daha fazla şey yapabilir. Diziler, döngüler gibi akış programlama vb. Gibi programlamada öğrendiğiniz şeylerin çoğu ile kendi başına bir programlama dili Ayrıca sed içinde "programlayabilirsiniz", ancak içinde yazılı kodu korumak istemeyeceksiniz .

2) Sed ve awk araçları için en iyi kullanım alanları nelerdir?

Sonuç: Çok basit metin ayrıştırma için sed kullanın. Bunun ötesinde her şey awk daha iyidir. Aslında, sed tamamen hendek ve sadece awk kullanabilirsiniz. İşlevleri çakıştığından ve awk daha fazlasını yapabildiğinden, awk kullanın. Öğrenme eğrinizi de azaltabilirsiniz.


7
Öğrenme eğrisi hakkında güzel bir nokta .. çok fazla araç karışabilir .. bu yüzden sadece grep ve awk öğrenmeyi tercih ederim .. sed unutmak sağlar :)
Outlier

174
^^ Yeterince sed. (üzgünüm, zorundaydım)
Greg M. Krsak

8
Ben sed öğrenmek çok daha kolay olduğunu düşünüyorum, bu yüzden bunu hesaba katmanız gerekir. Awk öğrenmeyi öğrendikçe, henüz awk'ta nasıl yapılacağını bilmediğiniz şeyler için daha hızlı kullanabilmek için hızlı bir şekilde sed öğrenmek faydalı olabilir.
Didier A.

1
@GregKrsak günümü yaptın. (üzgünüm, zorundaydım)
Abel Callejo

15
Hendek etmeyin sed, yazım sözdiziminden 's/search/replace'çok daha kolaydır awkve çoğu zaman ihtiyacınız olan şeydir.
sjas

54

Her iki aracın da metinle çalışması ve her iki aracın da kullanabileceği görevler vardır.

Benim için onları ayırma kuralı: sed Aksi takdirde bir metin düzenleyicide yapacağınız görevleri otomatikleştirmek için . Bu yüzden akış editörü denir . (Vim'deki metni düzenlemek için aynı komutları kullanabilirsiniz). Kullanım awksen sayma alanları, hesapla toplamları, özü ve yeniden düzenlemek yapıları vb anlamına metni analiz etmek istiyorsanız

Ayrıca unutmamalısınız grep. Kullanım grepyalnızca bir metin (dosyası) / özü şey aramak istiyorsanı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.