Linux altında metin işleme için AWK komutunu nasıl ustaca kullanabilirim?

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ğer formatıyla -v seçeneğini kullanmayı içerir. Örneğin, hello.awk betiğinize var1 ve var2 adı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 ARGV dizisini kullanmayı içerir. Örneğin, hello.awk betiğ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>1 koşulunu kullanıyoruz
  • Toplam ve yaş sayısını biriktirmek için sum ve count değişkenlerini kullanıyoruz . Üçüncü alanın değeriyle ( $3 ) değişkenleri artırmak için += operatörünü kullanıyoruz
  • END deseni 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>1 koşulunu kullanıyoruz
  • Minimum ve maksimum yaşları saklamak için min ve max değ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.

Önceki makale:Server'da FTPS ile dosya transferlerinizi nasıl güvenli hale getirebilirsiniz Windows ?
Sonraki makale:YouTube Premium'u ücretsiz nasıl edinebilirsiniz?
Merhaba, ben François :) Boş zamanlarımda teknolojiye olan tutkumu paylaşmayı seven bir yazarım! 😍 Donanım, yazılım, video oyunları, sosyal medya veya daha birçok alanda aradığınız her şeyi bu sitede bulabilirsiniz. Çeşitli platformlardaki analizlerimi, incelemelerimi, eğitimlerimi ve favori keşiflerimi paylaşıyorum. Sadece trendleri takip etmekle kalmayıp, sizi en iyi çözümlere yönlendirmeye çalışan, bilgili ve seçici bir teknoloji meraklısıyım. Bu yüzden takipte kalın!