Belge

Grep, Sed ve Awk Komutları Arasındaki Fark Nedir?

Metin işlemede ustalaşmadan kendimize güvenle Linux dosya yönetimi uzmanı diyemeyiz. Bilinen üç komut satırı aracı ( grep , sed ve awk ) Linux metin işlemcileri olarak itibarlarını artırmıştır. Tüm büyük Linux işletim sistemi dağıtımlarına önceden yüklenmiş olarak gelirler, bu nedenle varlıklarını bir Linux paket yöneticisi aracılığıyla sorgulamaya gerek yoktur.

grep , sed ve awk komutlarının metin işleme işlevlerinde benzersiz bir şekilde atfedilmesine rağmen , bazı basit senaryolar işlevlerini biraz örtüşmeye zorlar.

Örneğin, bu üç komutun tümü, bir dosya kalıbı eşleşme olasılığını rahatça sorgulayabilir ve sorgu sonuçlarını standart çıktıya iletebilir.

Yazımızda, bu üç metin işleme komutu arasındaki ayırt edici faktörü açıkça belirlemek amaçlanmaktadır.

Ek olarak, bu makale şu sonuca varmayı amaçlamaktadır:

  • Basit metin eşleştirme ve yazdırma çözümleri arıyorsanız grep komutuna yönelin
  • Metinleri eşleştirme ve yazdırmanın yanı sıra ek metin dönüştürme çözümleri (örneğin ikame ) arıyorsanız , sed komutuna yönelin
  • Güçlü bir betik dilinden çok sayıda metin işleme özelliği arıyorsanız, awk komutuna yönelin

Bu yazıyı daha bilgilendirici ve ilişkilendirilebilir hale getirmek için, referans alacağımız örnek bir metin dosyası tanımlayalım. Belirli bir zaman damgasına dayalı olarak çeşitli sistem etkinliklerini açıklayan SystemLog.txt adlı aşağıdaki dosyayı inceleyebilirsiniz.

Linux’ta grep Komutu

Tanım olarak, grep komutu, metni bir regex modeline göre eşleştirir ve yazdırır. Hedeflenen bir dosyada belirli bir satırın varlığını sorgulamak için hızlı bir çözümdür.

Kullanım sözdizimi aşağıdaki gibidir:

$ grep [OPTION...] PATTERNS [FILE...] 

Yukarıdaki sözdiziminde, PATTERNS , bir kullanıcı tarafından tanımlanan ve grep komutunun başvuracağı normal ifade modelini belirtir.

Kullanıcı Tanımlı Satırlarda Regex Kalıp Eşleşmesi Arama

Daha önce oluşturduğumuz sistem günlük dosyasına referansla, dosyadaki tüm ERROR olaylarını vurgulamak istediğimizi varsayalım , grep komutumuz aşağıdaki gibi görünecektir:

$ grep "ERROR" SystemLog.txt

grep komutu , sonuçları standart çıktıya yazdırmadan önce SystemLog.txt dosyasında ERROR satırının herhangi bir oluşumunu arayacaktır.

Bulunan Eşleşmeyi Ters Çevirme

Grep komutunda belirtilenler dışında dosyadaki tüm satırların yazdırılmasını istediğimizi varsayalım. Bu durumda -v seçeneğini kullanacağız.

$ grep -v "ERROR" SystemLog.txt

Önceki/Sonraki Satırları Yazdırma

HATA satırı eşleşmesinden sonra 4 satır yazdırmak için :

$ grep -A 4 "ERROR" SystemLog.txt

HATA satırı eşleşmesinden 4 satır önce yazdırmak için :

$ grep -B 4 "ERROR" SystemLog.txt

ERROR satırı eşleşmesinden önce ve sonra 3 satır yazdırmak için :

$ grep -C 3 "ERROR" SystemLog.txt

Linux’ta sed Komutu

sed komutu , ek metin işleme özellikleri nedeniyle grep’e göre bir avantaja sahiptir.

Referans sözdizimi aşağıdaki gibidir:

$ sed [OPTION]... {script-only-if-no-other-script} [input-file]...

sed’i grep olarak kullanma

ERROR satırıyla ilişkili dosya girişlerini aramak ve yazdırmak için grep komutunun sed eşdeğeri aşağıdaki gibidir :

$ sed -n '/ERROR/ p' SystemLog.txt

-n seçeneği, sed’in taranan her satırı yazdırmasını engeller.

Eşleşen Dizeyi Değiştirme ile Değiştirme

Metin dosyamızda ERROR satırını CRITICAL satırıyla değiştirmek istediğimizi varsayarsak , sed komut uygulaması aşağıdaki gibi görünecektir:

$ sed 's/ERROR/CRITICAL/' SystemLog.txt

Dosyaları Yerinde Değiştirme

-i bayrağının kullanıcı tanımlı bir sonekle birlikte kullanılması, sed’in kalıcı kullanıcı amaçlı işlemleri uygulamadan önce girdi dosyasının yedek bir kopyasını oluşturmasını sağlar.

Örneğin, yalnızca orijinal dosya durumunun yedek bir kopyasını oluşturduktan sonra CRITICAL satırını yeniden ERROR olarak yeniden adlandırabiliriz.

$ sed -ibackup 's/CRITICAL/ERROR/' SystemLog.txt  

Orijinal dosya SystemLog.txt yedeği olarak yeniden adlandırılacaktır.

$ ls -l SystemLog.txtbackup

Dosya değişikliklerinin gerçekleştiğini cat komutuyla da onaylayabiliriz :

$ cat SystemLog.txt

sed’yi Belirli Satır Numarasıyla Kısıtlama

sed işlemlerini metin dosyasının 6. satırıyla sınırlamak için şunu uygulayın:

$ sed '6 s/ERROR/GLITCH/' SystemLog.txt

2 ile 4 arasında değişen bir işlem belirtmek için şunu uygulayın:

$ sed '2,4 s/INFO/NOTE/' SystemLog.txt

Belirli bir satırdan, örneğin 5. satırdan itibaren desen eşleşmelerini yazdırmak için şunları uygulayın:

$ sed -n '5,/INFO/ p' SystemLog.txt

Linux’ta awk Komutu

awk komutu , çok sayıda yerleşik işlemi nedeniyle zaman, aritmetik ve dize işlemeyi gerçekleştirmek için kullanılabilir. Ayrıca, kullanıcıların özelleştirilebilir işlevlerini tanımlamalarına izin verilir.

Temel sözdizimi aşağıdaki gibidir:

$ awk [options] script file 

grep’i awk ile değiştirme

Bir dosyada satır aramak için kullanılan grep komutunun awk karşılığı aşağıdaki gibidir:

$ awk '/ERROR/{print $0}' SystemLog.txt

Eşleşen Bir Dize Değiştirme

awk komutu, satır değiştirme işlemleri için gsub (yerleşik bir yöntem) kullanır.

$ awk '{gsub(/ERROR/, "GLITCH")}{print}' SystemLog.txt

Üstbilgi ve Altbilgi Ekleme

Aşağıda gösterildiği gibi awk’nin BEGIN ve END bloklarını kullanarak giriş dosyalarına üstbilgi ve altbilgi ekleyebiliriz :

$ awk 'BEGIN {print "SYS LOG SUMMARY\n--------------"} {print} END {print "--------------\nEND OF LOG SUMMARY"}' SystemLog.txt

Sütun Manipülasyonu

Satır ve sütun yapılarına sahip CSV dosyaları gibi belgeler için , kullanıcının seçimine göre yalnızca 1. ve 2. sütunları veya 1. ve 3. sütunları yazdırma konusunda spesifik olabiliriz.

$ awk '{print $1, $2}' SystemLog.txt

Özel Alan Ayırıcı

awk komutunun varsayılan uygulaması, beyaz boşlukları sınırlayıcı olarak kabul eder . İşlenmekte olan metin sınırlayıcı olarak virgül veya noktalı virgül gibi karakterler kullanıyorsa, bunları aşağıdaki şekilde belirtebilirsiniz:

$ awk -F "," '{print $1, $2}' SystemLog.txt 
or 
$ awk -F ";" '{print $1, $2}' SystemLog.txt 

Aritmetik işlemler

Metin dosyasında INFO satırının oluşumunu aşağıdaki şekilde sayabiliriz .

$ awk '{count[$2]++} END {print count["INFO"]}' SystemLog.txt

Sayısal Karşılaştırma

awk betiği , değerleri yalnızca bir dize olarak değil, bir sayı olarak rahatça yorumlar. Örneğin, 2597763777’den daha eski zaman damgalarına sahip dosya girişlerini aşağıdaki şekilde alabiliriz:

$ awk '{ if ($1 > 2597763777 ) {print $0} }' SystemLog.txt

Artık elde etmek istediğimiz metin işleme derinliğine bağlı olarak grep , sed ve awk komutlarıyla ilişkili basitlikleri ve karmaşıklıkları tamamen ayırt edebiliriz.

Yazının orijinalini buradan okuyabilirsiniz.