AWK komutu , 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 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 `BEGIN` `END` `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
{print} komutu , n $n değişkeniyle belirli bir alanı da yazdırabilirsiniz -F seçeneğiyle değiştirebilirsiniz .
/etc/passwd :) 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 ...
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 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.
test.txt "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 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 ...
mantıksal operatörler && (ve), || (veya) ve ! /etc/passwd /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 bir dizenin tüm tekrarlarını başka bir dizeyle değiştiren gsub kullanabilirsiniz OFS . Ö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 NF test.txt adlı 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

FNR değişkenini kullanarak bir dosyanın satırları arasında yineleme yapmak için de for döngüsünü kullanabilirsiniz 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?
.awk uzantılı bir dosyaya yerleştirip chmod +x komutuyla çalıştırma izni verebilirsiniz ./script_name.awk [dosya] komutuyla çalıştırabilirsiniz .
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-vhello.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
ARGVhello.awkbetiğinize iki isimsiz argüman iletmek istiyorsanız , aşağıdaki komutu kullanabilirsiniz:
awk -f hello.awk hello world
hello.awk betiğinizde 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?
betikteki olası hatalar hakkında uyarı mesajları görüntüleyen lint birlikte -W seçeneğini , betiğin yürütülmesinin sonunda değişkenlerin değerlerini görüntüleyen dump-variables birlikte -W
AWK komutunu kullanarak verileri nasıl sıralayabilirim?
`sort` kullanabilirsiniz `/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
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 NF NR . Bir for döngüsü kullanarak, her satırdaki kelime sayısını sayabilir ve bunları total . Özel END nihai sonucu yazdırabilirsiniz. Örneğin, test.txt 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?
-F kullanabilirsiniz 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?
test.csv "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 30 yıldan eski satırları görüntülemek istiyorsanız
awk -F"," '$3 > 30 {print}' test.csv
Bu da şu sonucu verir:
Bob, Martin, 32
&& (ve), || (veya) ve ! mantıksal operatörlerini kullanarak birden fazla deseni birleştirebilirsiniz test.csv adı C veya yaşı 10 yaşından küçük satırları görüntülemek istiyorsanız
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 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",", 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 -
sumvecountdeğişkenlerini kullanıyoruz Üçüncü alanın değeriyle (3)+=operatörünü kullanıyoruz ENDdeseni nihai sonucu göstermek için kullanılır/ise toplamı sayıya bölerek ortalamayı hesaplamak için kullanılır
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",", 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 -
minvemaxdeğişkenlerini kullanıyoruz boşsa ("", üçüncü alanın değeriyle ($3Değ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, Windows Echo komutunu . AWK komutu hakkında daha fazla bilgi edinmek isterseniz, kılavuza veya çevrimiçi olarak bulunan birçok eğitime başvurabilirsiniz.


