AWK komutu , Linux'ta metin verilerini işlemek ve dönüştürmek için güçlü ve çok yönlü bir araçtır . Bilgi ayıklamanız, satırları filtrelemeniz, çıktıyı yeniden biçimlendirmeniz veya hesaplamalar yapmanız gerekse de, AWK yalnızca birkaç satır kodla işinizi kolaylaştırabilir. Bu makalede, Linux'ta metin manipülasyonu için AWK komutunu nasıl kullanacağınızı öğreneceksiniz.
AWK komutu nedir?

AWK komutu, Linux terminalinde çalışan yorumlayıcı tabanlı bir programlama dilidir. Adı, yaratıcılarının baş harflerinden gelir: Alfred Aho, Peter Weinberger ve Brian Kernighan. AWK başlangıçta CSV dosyaları veya /etc/passwd dosyaları gibi sınırlayıcılarla ayrılmış alanlara sahip dosyaları işlemek için tasarlanmıştır. Bununla birlikte, AWK HTML veya XML dosyaları gibi daha karmaşık metin dosyalarını da işleyebilir. AWK nesne yönelimli bir programlama dili, ancak yerel ve global fonksiyonların ve değişkenlerin tanımlanmasına izin verir. Ayrıca döngüler ve koşullu ifadeler gibi kontrol yapılarına da sahiptir.
AWK komutunun genel sözdizimi aşağıdaki gibidir:
awk [seçenekler] 'program' [dosyalar]
Program , dosyanın (veya dosyaların) her satırında aranacak kalıpları ve bir kalıp bulunduğunda gerçekleştirilecek eylemleri tanımlayan bir dizi talimattır. Seçenekler, alan ayırıcıyı veya çıktı biçimini seçmek gibi AWK komutunun davranışını değiştirmenize olanak tanır
AWK komutunu kullanarak nasıl metin yazdırabilirim?

AWK komutu, metindeki bir desene göre terminale bir mesaj yazdırmak için kullanılabilir. AWK komutunu herhangi bir desen belirtmeden, sadece yazdırma komutuyla çalıştırırsanız, Enter tuşuna her bastığınızda AWK mesajı yazdıracaktır.
Örneğin, şunu yazarsanız:
awk '{print "Merhaba"}'
Ve Enter tuşuna birkaç kez basarsanız şunu elde edersiniz:
Merhaba, merhaba, merhaba!
AWK komutunu durdurmak için Ctrl+C tuşlarına basabilirsiniz.
AWK komutunu kullanarak bir dosyanın içeriğini yazdırmak istiyorsanız, dosyayı okumadan önce çalışan özel `BEGIN` kalıbını ve dosyayı okuduktan sonra çalışan özel `END` kalıbını kullanabilirsiniz. Örneğin, `test.txt` adlı bir dosyanız varsa ve içeriği şu şekildeyse:
Bu bir test. AWK harika bir araç. Linux en iyi işletim sistemi
Dosyanın içeriğini aşağıdaki komutla yazdırabilirsiniz:
awk 'BEGIN {print "test.txt dosyasının içeriği burada:"} {print} END {print "Dosya sonu"}' test.txt
Bu da şu sonucu verir:
İşte test.txt dosyasının içeriği: Bu bir test. AWK harika bir araç. Linux en iyi işletim sistemi. Dosya sonu
Argüman olmadan kullanılan {print} komutu tüm satırı yazdırır. Ayrıca , n alan numarasını kullanarak belirli bir alanı da yazdırabilirsiniz . Varsayılan olarak, alanlar boşluk veya sekme ile ayrılır, ancak ayırıcıyı -F seçeneğiyle değiştirebilirsiniz .
Örneğin, /etc/passwd dosyasının iki nokta üst üste ( :) ile ayrılmış olan birinci ve üçüncü alanlarını yazdırmak istiyorsanız , aşağıdaki komutu kullanabilirsiniz:
awk -F: '{print $1 " " $3}' /etc/passwd
Bu da şöyle bir sonuç verir:
root 0 daemon 1 bin 2 sys 3 sync 4 games 5 man 6 lp 7 mail 8 news 9 uucp 10 proxy 13 www-data 33 ...
AWK komutunu kullanarak aritmetik ifadeler veya metin dizeleri de yazdırabilirsiniz. Örneğin, test.txt dosyasındaki ikinci alanın karesini yazdırmak istiyorsanız , aşağıdaki komutu kullanabilirsiniz:
awk '{print $2^2}' test.txt
Bu da şu sonucu verir:
16'dır
test.txt dosyasındaki satır sayısını yazdırmak istiyorsanız , geçerli satır numarasını içeren özel NR değişkenini kullanabilirsiniz . Örneğin, aşağıdaki komutu kullanabilirsiniz:
awk 'END {print NR}' test.txt
Bu da şu sonucu verir:
3
AWK komutu kullanarak metin nasıl filtrelenir?

AWK komutu, kalıplara veya koşullara göre metni filtrelemek için kullanılabilir. Bir işlemden önce bir kalıp belirtirseniz, AWK işlemi yalnızca kalıp satırda bulunduğunda gerçekleştirir. Kalıp, normal bir ifade, bir karşılaştırma, mantıksal bir işlem veya bunların bir kombinasyonu olabilir.
Örneğin, test.txt dosyasındaki "Linux" kelimesini içeren satırları yazdırmak istiyorsanız , aşağıdaki komutu kullanabilirsiniz:
awk '/Linux/ {print}' test.txt
Bu da şu sonucu verir:
Linux en iyi işletim sistemidir
/etc/passwd dosyasındaki UID değeri 1000'den büyük olan satırları yazdırmak istiyorsanız , aşağıdaki komutu kullanabilirsiniz:
awk -F: '$3 > 1000 {print}' /etc/passwd
Bu da şöyle bir sonuç verir:
systemd-coredump:x:997:997:systemd Çekirdek Döküm Aracı:/:/usr/sbin/nologin tss:x:131:142:TPM yazılım yığını,,,:/var/lib/tpm:/bin/false _rpc:x:132:65534::/run/rpcbind:/usr/sbin/nologin statd:x:133:65534::/var/lib/nfs:/usr/sbin/nologin libvirt-qemu:x:64055:139:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:134:144:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin snapd-range-524288-root:x:524288:524288::/nonexistent:/bin/false snap_daemon:x:584788:584788::/nonexistent:/bin/false ...
Desenleri birleştirmek için mantıksal operatörler && (ve), || (veya) ve ! (değil) de kullanabilirsiniz. Örneğin, /etc/passwd dosyasında UID'si 1000'den büyük ve shell'i /usr/sbin/nologin dışında olan satırları yazdırmak istiyorsanız , aşağıdaki komutu kullanabilirsiniz:
awk -F: '$3 > 1000 && $7 != "/usr/sbin/nologin" {print}' /etc/passwd
Kopyala
Bu da şöyle bir sonuç verir:
tss:x:131:142:TPM yazılım yığını,,,:/var/lib/tpm:/bin/false _rpc:x:132:65534::/run/rpcbind:/usr/sbin/nologin statd:x:133:65534::/var/lib/nfs:/usr/sbin/nologin libvirt-qemu:x:64055:139:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:134:144:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin snapd-range-524288-root:x:524288:524288::/nonexistent:/bin/false snap_daemon:x:584788:584788::/nonexistent:/bin/false ...
AWK komutunu kullanarak metin nasıl düzenlenir?

AWK komutu, yerleşik fonksiyonlar veya özel değişkenler kullanarak metni değiştirmek için kullanılabilir. Örneğin, test.txt dosyasındaki boşlukları tirelerle değiştirmek istiyorsanız, bir dizenin tüm tekrarlarını başka bir dizeyle değiştiren gsub fonksiyonunu kullanabilirsiniz . Ayrıca, çıktı alan ayırıcıyı tanımlayan OFS özel değişkenini de kullanabilirsiniz . Örneğin, aşağıdaki komutu kullanabilirsiniz:
awk '{print strftime("%d/%m/%Y %H:%M:%S",$1 " " $2)}' test.txt
Bu da şu sonucu verir:
30/10/2021 16:13:49
31/10/2021 17:14:50
01/11/2021 18:15:51
Diğer kullanılabilir fonksiyonlar ve değişkenler hakkında bilgi edinmek için AWK komut kılavuzuna başvurabilirsiniz.
AWK komutuyla for döngüsü nasıl kullanılır?
AWK komutu, bir dosyanın alanları veya satırları üzerinde for döngüleri gerçekleştirmek için kullanılabilir. For döngüsünün sözdizimi şu şekildedir:
(Dizideki değişken) için eylem
Burada `variable` , diziden sırayla değerler alan değişkenin adıdır ve `action` , her yinelemede gerçekleştirilecek eylemdir.
Örneğin, bir dosyanın alanlarını ters sırada yazdırmak istiyorsanız, geçerli satırdaki alan sayısını içeren özel NF değişkeniyle bir for döngüsü kullanabilirsiniz. Örneğin, test.txt adlı bir dosyanız varsa ve bu dosya şunları içeriyorsa:
Bu bir test. AWK harika bir araç. Linux en iyi işletim sistemi
Aşağıdaki komutla alanların sırasını tersine çevirebilirsiniz:
awk '{for (i=NF; i>0; i--) print $i}' test.txt
Bu da şu sonucu verir:
Bir test aracı bu müthiş araçtır; bir diğeri AWK'dır; en iyi işletim sistemi ise Linux'tur

Ayrıca, geçerli dosyanın satır numarasını içeren özel FNR değişkenini kullanarak bir dosyanın satırları arasında yineleme yapmak için de for döngüsünü kullanabilirsiniz . Örneğin, test.txt dosyasının çift numaralı satırlarını yazdırmak istiyorsanız , aşağıdaki komutu kullanabilirsiniz:
awk 'FNR%2==0 {print FNR}' test.txt
Bu da şu sonucu verir:
2
4
AWK betiğini nasıl çalıştırırım?
Bir AWK betiğini çalıştırmak için, betiği .awk uzantılı bir dosyaya yerleştirip chmod +x komutuyla çalıştırma izni verebilirsiniz . Ardından, betiği ./script_name.awk [dosya] komutuyla çalıştırabilirsiniz .
Örneğin, hello.awk adında ve içinde şu içeriğe sahip bir betiğiniz varsa :
#!/usr/bin/awk -f BEGIN {print "Merhaba"}
Aşağıdaki komutla betiği çalıştırabilirsiniz:
./hello.awk
Bu da şu sonucu verir:
Günaydın
AWK betiğine nasıl argüman gönderirim?

AWK betiğine argüman iletmek için iki yöntem kullanabilirsiniz:
- İlk yöntem,
değişken=değerformatıyla-vseçeneğini kullanmayı içerir. Örneğin,hello.awkbetiğinizevar1vevar2adında iki argüman geçirmek istiyorsanız , aşağıdaki komutu kullanabilirsiniz:
awk -v var1=hello -v var2=world -f hello.awk
hello.awk betiğinizde , $var1 ve $var2 değişkenlerini kullanarak argümanlara erişebilirsiniz . Örneğin, betiğiniz şunları içeriyorsa:
#!/usr/bin/awk -f BEGIN {print $var1 " " $var2}
Şunları elde edersiniz:
Selam Dünya
- İkinci yöntem, betiğe iletilen argümanları içeren özel
ARGVdizisini kullanmayı içerir. Örneğin,hello.awkbetiğinize iki isimsiz argüman iletmek istiyorsanız , aşağıdaki komutu kullanabilirsiniz:
awk -f hello.awk hello world
Ve hello.awk betiğinizde , argümanlara ARGV[1] ve ARGV[2] indekslerini kullanarak erişebilirsiniz . Örneğin, betiğiniz şunları içeriyorsa:
#!/usr/bin/awk -f BEGIN {ARGV[1] yazdır " " ARGV[2]}
Şunları elde edersiniz:
Selam Dünya
SSS
AWK ve GAWK arasındaki fark nedir?
GAWK, AWK'nın GNU tarafından geliştirilmiş bir uygulamasıdır ve orijinal dile genişletilmiş düzenli ifadeler, çok boyutlu diziler veya önceden tanımlanmış fonksiyonlar gibi ek özellikler ekler.
AWK betiğinde nasıl hata ayıklama yaparım?
Bir AWK betiğinde hata ayıklamak için, betikteki olası hatalar hakkında uyarı mesajları görüntüleyen lint parametresiyle birlikte -W seçeneğini kullanabilirsiniz. Ayrıca , betiğin yürütülmesinin sonunda değişkenlerin değerlerini görüntüleyen dump-variables parametresiyle birlikte -W seçeneğini de kullanabilirsiniz
AWK komutunu kullanarak verileri nasıl sıralayabilirim?
AWK komutunu kullanarak verileri sıralamak için, `sort` komutunu AWK ile birlikte kullanabilirsiniz . Örneğin, `/etc/passwd` dosyasındaki kullanıcıları UID'lerine göre sıralamak istiyorsanız , aşağıdaki komutu kullanabilirsiniz:
awk -F: '{print $1, $3}' /etc/passwd | sort -n -k2
AWK'yı diğer komutlarla (burada sort komutuyla ) birleştirerek , verileri görüntüleme ve düzenleme konusunda çok daha ileri gidebilirsiniz.
AWK komutunu kullanarak bir dosyadaki kelime sayısını nasıl yazdırabilirim?
AWK komutunu kullanarak bir dosyadaki kelime sayısını yazdırmak için, geçerli satırdaki alan sayısını içeren özel NF değişkenini ve geçerli satır numarasını içeren özel NR değişkenini kullanabilirsiniz . Bir for döngüsü kullanarak, her satırdaki kelime sayısını sayabilir ve bunları total adlı bir değişkene ekleyebilirsiniz . Özel END kalıbını kullanarak nihai sonucu yazdırabilirsiniz. Örneğin, test.txt adlı bir dosyanız varsa ve şu içeriğe sahipse:
Bu bir test. AWK harika bir araç. Linux en iyi işletim sistemi
Dosyadaki kelime sayısını aşağıdaki komutla yazdırabilirsiniz:
awk '{for (i=1; i<=NF; i++) total++} END {print total}' test.txt
Bu da şu sonucu verir:
9
AWK komutunu kullanarak CSV dosyasından veri nasıl çıkarabilirim?
AWK komutunu kullanarak CSV (virgülle ayrılmış değerler) dosyasından veri çıkarmak için, alan ayırıcıyı virgül olarak ayarlamak üzere -F seçeneğini kullanabilirsiniz . Örneğin, test.csv adlı bir dosyanız varsa ve bu dosya şunları içeriyorsa:
İsim, soyad, yaş: Alice Dupont, 25; Bob Martin, 32; Charles Durand, 28
Aşağıdaki komutu kullanarak kişilerin adını ve yaşını çıkarabilirsiniz:
awk -F"," '{print $1 " " $3}' test.csv
Bu da şu sonucu verir:
İsim, yaş: Alice 25, Bob 32, Charles 28
AWK komutu kullanılarak veriler nasıl filtrelenir?
AWK komutu, düzenli ifadeler veya mantıksal koşullar olan kalıplara göre verileri filtrelemenizi sağlar. Kalıplar, süslü parantezlerle ayrılarak eylemlerden önce yerleştirilir. Örneğin, test.csv dosyasında "Alice" adını içeren satırları görüntülemek istiyorsanız , aşağıdaki kalıbı kullanabilirsiniz:
awk -F"," '/Alice/ {print}' test.csv
Bu da şu sonucu verir:
Alice, Dupont, 25
test.csv dosyasındaki 30 yıldan eski satırları görüntülemek istiyorsanız , aşağıdaki kalıbı kullanabilirsiniz:
awk -F"," '$3 > 30 {print}' test.csv
Bu da şu sonucu verir:
Bob, Martin, 32
&& (ve), || (veya) ve ! (değil) mantıksal operatörlerini kullanarak birden fazla deseni birleştirebilirsiniz . Örneğin, test.csv dosyasında adı C ile başlayan veya yaşı 10 yaşından küçük olan satırları görüntülemek istiyorsanız , aşağıdaki deseni kullanabilirsiniz:
awk -F"," '($1 ~ /^C/) || ($3 < 10) {print}' test.csv
Bu da şu sonucu verir:
CAMILLE,M,7 CLARA,F,11 CLEMENT,M,7
AWK komutu kullanılarak istatistikler nasıl hesaplanır?
AWK komutu, bir dosyadaki sayısal veriler üzerinde toplam, ortalama, minimum veya maksimum gibi istatistikler hesaplamanıza olanak tanır. Bunu yapmak için, ara değerleri saklamak üzere değişkenler kullanmanız ve her satırda bunları güncellemeniz yeterlidir. Özel END kalıbını kullanarak nihai sonucu görüntüleyebilirsiniz. Örneğin, test.csv dosyasındaki yaşların toplamını ve ortalamasını hesaplamak istiyorsanız , aşağıdaki programı kullanabilirsiniz:
awk -F"," 'NR>1 {sum+=$3; count++} END {print "Toplam: " sum; print 'Ortalama: 'sum/count}' test.csv
Bu da şu sonucu verir:
Toplam: 110 Ortalama: 18.3333
Açıklama:
-F","seçeneği , alan ayırıcıyı virgül olarak tanımlamak için kullanılır- Sütun adlarını içeren dosyanın ilk satırını yok saymak için
NR>1koşulunu kullanıyoruz - Toplam ve yaş sayısını biriktirmek için
sumvecountdeğişkenlerini kullanıyoruz . Üçüncü alanın değeriyle ($3) değişkenleri artırmak için+=operatörünü kullanıyoruz ENDdeseni nihai sonucu göstermek için kullanılır ./operatörü ise toplamı sayıya bölerek ortalamayı hesaplamak için kullanılır
Benzer şekilde, test.csv dosyasındaki minimum ve maksimum yaşları hesaplamak istiyorsanız , aşağıdaki programı kullanabilirsiniz:
awk -F"," 'NR>1 {if (min=="") min=max=$3; if ($3<min) min=$3; if ($3> max) max=$3} END {print "Min: " min; print 'Max: 'max}' test.csv
Bu da şu sonucu verir:
Minimum: 6 Maksimum: 32
Açıklama:
-F","seçeneği , alan ayırıcıyı virgül olarak tanımlamak için kullanılır- Sütun adlarını içeren dosyanın ilk satırını yok saymak için
NR>1koşulunu kullanıyoruz - Minimum ve maksimum yaşları saklamak için
minvemaxdeğişkenlerini kullanıyoruz . Bu değişkenler boşsa ("") , üçüncü alanın değeriyle ($3) başlatıyoruz. Değerleri karşılaştırmak ve gerekirse değişkenleri güncellemek için<ve>operatörlerini kullanıyoruz - END
,nihai sonucu görüntülemek için kullanılır.
Çözüm
AWK komutu, Linux'ta metin işleme için temel bir araçtır. Veri ayıklama, filtreleme, değiştirme veya hesaplama gibi karmaşık görevleri yalnızca birkaç satır kodla gerçekleştirmenizi sağlar. Desenleri, eylemleri, fonksiyonları ve değişkenleri sayesinde büyük bir esneklik sunar. Yeteneklerini genişletmek için diğer Linux komutlarıyla birleştirilebilir. Örneğin, Echo komutunu Windows . AWK komutu hakkında daha fazla bilgi edinmek isterseniz, kılavuza veya çevrimiçi olarak bulunan birçok eğitime başvurabilirsiniz.


