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.
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.