Awk ve grep ile kesmek arasındaki kesin farklar nelerdir? [kapalı]


30

Bu iki tekniği kullanarak istediğimiz satırın ikinci sütununu bir dosyadan alabileceğimizi biliyoruz:

awk '/WORD/ { print $2 }' filename

veya

grep WORD filename| cut -f 2 -d ' '

Benim sorularım:

  • Yukarıdaki iki komut arasındaki farklar nelerdir?
  • Hangisi en iyi performansa sahip?
  • Kullanım awkyerine kullanmanın cutve tersini kullanmanın avantajları nelerdir ?
  • Hangi seçenekleri awkbize devretti cutve tersi nedir?

yani echo filenameya cat filename?
Avinash Raj

@AvinashRaj özür dilerim düzenledi
Networker

Yanıtlar:


35

İki satırınız arasındaki en belirgin fark, girdiye bağlı olacaktır. alan sınırlayıcı olarak cuttek bir karakter alır -d(varsayılanı TAB) ve bu karakterin her bir oluşumu yeni bir alan başlatır. awkBununla birlikte, daha esnektir. Ayırıcı FSdeğişkendedir ve boş bir dize (her giriş karakteri ayrı bir alan oluşturur), tek bir karakter veya normal bir ifade olabilir. Tek boşluk karakterli özel durum (varsayılan), herhangi bir boşluk dizisi üzerinde bölünme anlamına gelir . Ayrıca, awkönde gelen boşlukları varsayılan olarak gizler.

Lütfen karşılaştırın:

$ echo "abc def" | cut -f 2 -d ' '
def
$ echo "abc    def" | cut -f 2 -d ' '

$ echo " abc def" | cut -f 2 -d ' '
abc


$ echo "abc def" | awk '{ print $2 }'
def
$ echo "abc    def" | awk '{ print $2 }'
def
$ echo " abc def" | awk '{ print $2 }'
def

Burada, awkarasındaki boşlukların sekansı böler abcve defbuna cutayırıcı olarak her yere ihtiyaç vardır.

Aldığınız şey, ne elde etmek istediğinize bağlı olacaktır. Aksi takdirde, kendi programlama dili cutolan daha küçük ve tek amaçlı bir araç olduğu için daha hızlı olmasını beklerdim awk.


cevap olarak istediğimi, teşekkürler soruyu cevaplandı olarak işaretleyeceğim @Dubu
Networker

1
cuttek başına Awk'ten daha hızlı olması muhtemeldir , ancak grep ... | cutsaf Awk'ten daha hızlı olacağı kesin değildir .
Wildcard

8

Genel olarak, bir araç ne kadar uzmanlaşırsa, o kadar hızlı olur. Yani çoğu durumda, bekleyebilirsiniz cutve grepdaha hızlı olması için sed, ve seddaha hızlı olması için awk. Daha karmaşık araçların tek bir başlatılmasıyla daha uzun araçların daha basit boru hatlarını karşılaştırıyorsanız, kural yoktur. Bu sadece büyük girdilere (yani, milyonlarca satırlık) önem taşır; Kısa girişler için herhangi bir fark görmezsiniz.

Daha karmaşık araçların avantajı elbette daha fazla şey yapabilmeleridir.

Komutlarınız kediyi gereksiz yere kullanır. Bunun yerine yönlendirmeyi kullanın (özellikle hız konusunda endişeleniyorsanız, kıyaslama yapmadan önce muhtemelen hız konusunda endişelenmemelisiniz).

<fileName awk '/WORD/ { print $2 }'
<fileName grep WORD | cut -f 2 -d ' '

Bu komutlar neredeyse eşdeğerdir. Farklılıklar:

  • awk ve grep farklı regexp sözdizimlerine sahiptir . Awk ve grep -Eneredeyse aynı regexp sözdizimleri var (genişletilmiş düzenli ifadeler).
  • cut -d ' 'her bir bireysel boşluk karakterini sınırlayıcı olarak kabul eder. Awk'ın varsayılan sınırlayıcısı, birden çok boşluk, sekme vb. Olabilen herhangi bir boşluk dizisidir cut. Ayırıcı olarak isteğe bağlı boşluk dizileri kullanamazsınız . (Örneğin, varsayılan “herhangi bir boşluk sekansı”, yani özel bir durum olan) tek bir boşluk meydana gelen bir regexp'nin dışında tek bir boşluk, eşleşen bir regexp'nin saha ayırıcı koymak awk aymalar, tek tek boşluk kullanmak için: awk -F '[ ]' '/WORD/ {print $2}'.

Optimiz Program Optimizasyonunun İlk Kuralı: Yapmayın. İkinci Program Optimizasyon Kuralı (sadece uzmanlar için!): Henüz yapma. - Michael A. Jackson


1

Senin emrin,

cat fileName | awk '/WORD/ { print $2 }'

Bir catkomuta bile ihtiyacınız yok . Deneyebilirsin

awk '/WORD/ { print $2 }' filename

Aşağıdaki komut çıktıyı kediden grep'e, sonra kesmeye yönlendirir,

cat fileName | grep WORD | cut -f 2 -d ' '

Büyük olasılıkla çıktı yönlendirmesini önlemek zorundayız. Awk işi tek satırda yapar, ancak yalnızca belirli sözcükleri içeren satırları almak için cutbir grepkomut gerektirir ve bu sütun 2'yi sınırlayıcı alana göre yazdırır.

Kesim başarısız olursa şeyleri awk olarak yapabilirsiniz.


3
ps, grep için bir kedi komutuna gerek yoktur. Sadece yapabilirsin grep WORD filename.
7'de

@ edvinas.me evet.
Avinash Raj
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.