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.

image 72

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.

image 73

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
image 74

Ö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
image 75

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

$ grep -B 4 "ERROR" SystemLog.txt
image 76

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

$ grep -C 3 "ERROR" SystemLog.txt
image 77

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
image 78

-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
image 79

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
image 80

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
image 81

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
image 82

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
image 83

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
image 84

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
image 85

Ü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
image 86

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
image 87

Ö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
image 88

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.

Hüseyin GÜÇ

Kariyerime 26 yıl önce başladım. Windows ve Linux sistemlerinin kurulumu, yapılandırılması, yönetimi ve bakımı dahil olmak üzere birden fazla sistem üzerinde uzmanlaştım. Açık kaynak dünyasındaki en son gelişmelerden haberdar olmaktan ve Linux hakkındaki en son araçları, özellikleri ve hizmetleri denemekten hoşlanıyorum. Son 6 yıldır  sistem ve ağ yöneticisi olarak görev yapıyorum ayrıca Pardus Dönüşüm Projesini yönetiyorum ve Pardus İşletim Sisteminin yaygınlaşması adına uğraş gösteriyorum. Boş zamanlarımda açık kaynaklı uygulamaların Türkçe çevirisine katılıyorum ve The Document Foundation üyesiyim.