Perintah awk: Menampilkan Field, Pemisah -F, dan Pola Kondisi

Lingkungan ujiKeluarga RHELAlmaLinux 9.8akun rootDiperiksa 2026-10-29

Perintah awk adalah alat Linux yang membaca file teks baris demi baris, membagi setiap baris menjadi field berdasarkan spasi atau pemisah yang Anda tentukan, lalu memilih hanya field dari baris yang memenuhi kondisi untuk ditampilkan atau dihitung. Di server AlmaLinux 9, kami menghitung jumlah permintaan per IP dan jumlah per kode status dari file contoh log akses server web dengan satu baris yang disambung ke sort lewat pipe, dan ternyata ketiga respons 404 dari dua belas baris itu semuanya permintaan wp-login.php dan .env dari satu IP.

Output di bawah ini diperoleh dengan akun root di dalam folder kerja pada server AlmaLinux 9.8. Log akses, daftar akun, catatan penjualan, dan file skor adalah file contoh yang dibuat untuk pengujian, dan alamat IP serta nama akun di dalamnya juga nilai contoh.

1️⃣ Penggunaan dasar perintah awk

  • ↪️ Nomor field dan print

awk membagi setiap baris yang dibaca berdasarkan spasi dan memberi nomor field dari depan seperti $1, $2, $3. Kami memeriksanya dengan scores.txt, yang nama, hasil, dan skornya dipisahkan spasi.

cat scores.txt
alice   pass  82
bob     fail  47
carol   pass  91
dave    pass  68
erin    fail  55

Kurung kurawal di dalam tanda kutip tunggal berisi aksi yang dijalankan pada setiap baris, dan jika Anda menulis nomor field setelah print dengan pemisah koma, hanya field itu yang keluar. Saat field pertama dan ketiga ditampilkan, hanya nama dan skor yang tersisa.

awk '{print $1, $3}' scores.txt
alice 82
bob 47
carol 91
dave 68
erin 55

Jika koma di antara field dihapus dan Anda menulis $1 $3, kedua nilai tersambung tanpa spasi. Koma pada print menyisipkan pemisah output (bawaannya satu spasi), sedangkan nilai yang ditulis berdampingan tanpa koma digabung menjadi satu string.

awk '{print $1 $3}' scores.txt
alice82
bob47
carol91
dave68
erin55

NR adalah nomor baris yang dibaca sejauh ini, dan NF adalah jumlah field pada baris itu. $NF berarti field terakhir, jadi Anda bisa memilih kolom terakhir meski jumlah field berbeda di setiap baris.

awk '{print NR, NF, $NF}' scores.txt
1 3 82
2 3 47
3 3 91
4 3 68
5 3 55

Log akses server web juga dipisahkan spasi, jadi field dipilih dengan cara yang sama. Nomor field pada baris pertama log uji adalah sebagai berikut.

FieldNilai pada baris pertamaArti
$1192.0.2.10IP klien
$4[29/Oct/2026:00:01:12Tanggal dan waktu permintaan
$6"GETMetode permintaan (diawali tanda kutip ganda)
$7/index.htmlURL permintaan
$9200Kode status
$105120Byte terkirim
$11"-"Halaman sebelumnya (Referer)
$12~$15"Mozilla/5.0 (X11; Linux x86_64)"User agent (terbagi di setiap spasi)

Kami menampilkan $1, $7, dan $9, yaitu IP klien, URL permintaan, dan kode status.

awk '{print $1, $7, $9}' access.log
192.0.2.10 /index.html 200
198.51.100.7 /about.html 200
192.0.2.10 /images/logo.png 200
203.0.113.25 /wp-login.php 404
203.0.113.25 /wp-login.php 404
192.0.2.10 /contact.html 200
198.51.100.7 /old-page.html 301
203.0.113.25 /.env 404
192.0.2.44 /index.html 200
198.51.100.7 /api/search?q=awk 500
192.0.2.44 /images/logo.png 304
192.0.2.10 /index.html 200

Kolom yang nilainya mengandung spasi, seperti user agent, terbagi menjadi beberapa field. NF pada ketiga baris pertama semuanya 15, dan $NF adalah potongan terakhir user agent.

awk '{print NF, $NF}' access.log | head -3
15 x86_64)"
15 x86_64)"
15 x86_64)"

2️⃣ Menentukan pemisah dengan awk -F

  • ↪️ Pemisah titik dua, koma, dan ekspresi reguler

Untuk file yang kolomnya dipisahkan simbol selain spasi, tulis simbol itu setelah -F. Saat $1 ditampilkan tanpa -F dari daftar akun users.txt, yang dibuat dengan bentuk sama seperti /etc/passwd, sebagian besar baris keluar utuh.

awk '{print $1}' users.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
nobody:x:65534:65534:Kernel
user:x:1000:1000:Example
deploy:x:1001:1001:Deploy
backup:x:1002:1002::/home/backup:/sbin/nologin

Pemisah bawaan adalah spasi, jadi baris yang hanya tersambung titik dua memiliki satu field saja. Hanya baris nobody, user, dan deploy yang memiliki spasi di kolom deskripsi yang terpotong di spasi itu.

Dengan -F:, titik dua menjadi pemisah, sehingga nama akun ($1) dan shell login ($7) terpisah.

awk -F: '{print $1, $7}' users.txt
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
nobody /sbin/nologin
user /bin/bash
deploy /bin/bash
backup /sbin/nologin

File CSV yang dipisahkan koma dibagi dengan -F,. Saat item dan jumlah dari catatan penjualan sales.csv ditampilkan, header di baris pertama (item qty) juga terbagi dengan cara yang sama dan ikut muncul.

awk -F, '{print $2, $3}' sales.csv
item qty
keyboard 2
mouse 5
monitor 1
keyboard 1
cable 10
mouse 2
monitor 2

-F, tidak cocok untuk CSV yang memiliki koma di dalam kolom bertanda kutip ganda. Pada quoted.csv yang kolom itemnya berisi koma, field juga terbagi di koma dalam tanda kutip, sehingga field kedua hanya berisi bagian awal nama item.

awk -F, '{print $2}' quoted.csv
item
"cable
keyboard

Untuk file seperti ini, manual resmi GNU Awk menjelaskan cara memakai variabel FPAT. Jika Anda menulis bentuk satu field sebagai ekspresi reguler alih-alih pemisah, kolom bertanda kutip keluar sebagai satu field.

awk -v FPAT='([^,]*)|("[^"]*")' '{print $2}' quoted.csv
item
"cable, usb"
keyboard

Untuk memakai beberapa pemisah, tulis sebagai ekspresi reguler di dalam kurung siku. Jika titik dua dan garis miring sama-sama menjadi pemisah, $NF menjadi nama terakhir pada jalur shell login (bash, nologin).

awk -F'[:/]' '{print $1, $NF}' users.txt
root bash
bin nologin
daemon nologin
nobody nologin
user bash
deploy bash
backup nologin

3️⃣ Pola kondisi perintah awk

  • ↪️ Ekspresi reguler, perbandingan, dan NR

Meski field sudah dipilih, semua baris tetap ditampilkan, jadi untuk menyisakan baris yang diperlukan, letakkan kondisi (pola) sebelum kurung kurawal. String di antara garis miring hanya memilih baris yang memuatnya, dan jika aksi dihilangkan, seluruh baris ditampilkan.

awk '/wp-login/' access.log
203.0.113.25 - - [29/Oct/2026:00:04:51 +0000] "POST /wp-login.php HTTP/1.1" 404 196 "-" "Mozilla/5.0 (X11; Linux x86_64)"
203.0.113.25 - - [29/Oct/2026:00:04:52 +0000] "POST /wp-login.php HTTP/1.1" 404 196 "-" "Mozilla/5.0 (X11; Linux x86_64)"

Hasil pemilihan baris sama dengan perintah grep, dan awk bisa langsung memilih field dari baris itu lalu menampilkannya. Jika dua baris yang sama hasil grep dikirim ke awk lewat pipe, hanya IP dan kode status yang tersisa.

grep wp-login access.log | awk '{print $1, $9}'
203.0.113.25 404
203.0.113.25 404

Nilai field dibandingkan dengan ==, !=, >, >=, <, <=. Kami memilih hanya baris dengan kode status ($9) 404 dan menampilkan IP serta URL permintaan.

awk '$9 == 404 {print $1, $7}' access.log
203.0.113.25 /wp-login.php
203.0.113.25 /wp-login.php
203.0.113.25 /.env

Saat membandingkan dengan string, apit nilainya dengan tanda kutip ganda. Kami memilih hanya nama yang field keduanya pass.

awk '$2 == "pass" {print $1}' scores.txt
alice
carol
dave

Perbandingan angka dipakai untuk memilih berdasarkan rentang, seperti nomor akun (UID). Saat memilih akun dengan UID 1000 ke atas, selain akun biasa ikut masuk juga nobody yang UID-nya 65534.

awk -F: '$3 >= 1000 {print $1, $3}' users.txt
nobody 65534
user 1000
deploy 1001
backup 1002

Dua kondisi digabung dengan &&. Jika kondisi di bawah 65534 ditambahkan, nobody keluar dan hanya tersisa tiga akun biasa beserta folder home-nya.

awk -F: '$3 >= 1000 && $3 < 65534 {print $1, $6}' users.txt
user /home/user
deploy /home/deploy
backup /home/backup

[~] memeriksa apakah field cocok dengan ekspresi reguler, dan [!~] memeriksa apakah tidak cocok. Saat memilih akun yang shell login-nya ($7) berakhiran bash dan akun yang bukan nologin, muncul tiga akun yang sama.

awk -F: '$7 ~ /bash$/ {print $1}' users.txt
root
user
deploy
awk -F: '$7 !~ /nologin/ {print $1, $7}' users.txt
root /bin/bash
user /bin/bash
deploy /bin/bash

Kondisi NR memilih berdasarkan nomor baris. NR > 1 menghapus baris header CSV sehingga hanya catatan penjualan yang tersisa.

awk -F, 'NR > 1 {print $2, $3}' sales.csv
keyboard 2
mouse 5
monitor 1
keyboard 1
cable 10
mouse 2
monitor 2

Output perintah lain juga bisa dikirim lewat pipe dan dibagi dengan cara yang sama. Saat memilih ukuran file ($5) dan nama ($9) dari output ls -l, baris pertama keluar kosong, karena baris pertama ls -l, [total 24], tidak memiliki field kelima dan kesembilan.

ls -l | awk '{print $5, $9}'

1567 access.log
79 quoted.csv
207 sales.csv
85 scores-copy.txt
85 scores.txt
315 users.txt

Dengan NR > 1, baris pertama hilang dan hanya ukuran serta nama file yang tersisa.

ls -l | awk 'NR > 1 {print $5, $9}'
1567 access.log
79 quoted.csv
207 sales.csv
85 scores-copy.txt
85 scores.txt
315 users.txt

4️⃣ awk BEGIN, END, jumlah, dan rata-rata

  • ↪️ Variabel dan format output printf

Blok BEGIN berjalan sekali sebelum baris pertama dibaca, dan blok END berjalan sekali setelah baris terakhir diproses. Untuk jumlah total, tambahkan ke variabel di setiap baris lalu tampilkan di END. Diagram di bawah ini menunjukkan urutan yang dilalui awk di setiap baris saat menjumlahkan nilai pada catatan penjualan.

🔁 Urutan awk memproses sales.csv baris demi baris
Diagram penjelasan
🔁 Urutan pemrosesan
$ awk -F, 'NR > 1 {t += $3 * $4} END {printf "total %.2f\n", t}' sales.csv
① Baris yang dibacaNR = 1date,item,qty,priceNR = 22026-10-01,keyboard,2,45.00NR = 32026-10-01,mouse,5,19.90NR = 82026-10-04,monitor,2,189.00Tidak ada baris lagiBaris 8 adalah baris terakhir.
② Membagi field (-F,)$1date$2item$3qty$4priceBaris header juga dibagi dengan cara yang sama.$12026-10-01$2keyboard$32$445.00$3 jumlah, $4 harga satuan$12026-10-01$2mouse$35$419.90$3 jumlah, $4 harga satuan$12026-10-04$2monitor$32$4189.00$3 jumlah, $4 harga satuanTidak ada baris untuk dibagiBlok END tidak membaca baris.
③ Pola dan aksiNR > 1 salahAksi dilewati.t = (kosong)NR > 1 benart += 2 * 45.00t = 90NR > 1 benart += 5 * 19.90t = 189.5NR > 1 benart += 2 * 189.00t = 886.3END dijalankantotal 886.30printf menampilkan t sampai dua angka desimal.
Baris pertama adalah header, jadi NR > 1 bernilai salah dan awk lanjut ke baris berikutnya tanpa menjalankan aksi.
Mulai baris kedua pola bernilai benar, dan 90, hasil kali jumlah dan harga satuan, ditambahkan ke variabel t.
Variabel t mempertahankan nilainya antarbaris, jadi total sampai baris ketiga adalah 189.5.
Baris 4 sampai 7 melalui urutan yang sama, dan sampai baris terakhir, baris 8, t mencapai 886.3.
Setelah baris terakhir diproses, blok END berjalan sekali dan printf menampilkan total 886.30.

Jumlah semua byte terkirim ($10) pada log akses adalah 41298 byte. Variabel yang baru dipakai dimulai dari nilai kosong (0 sebagai angka), jadi tidak perlu diisi 0.

awk '{sum += $10} END {print sum}' access.log
41298

Jika jumlah ditampilkan pada aksi yang berjalan di setiap baris, bukan di END, setiap baris menampilkan total sementara. Jika nomor baris dan t ditampilkan setiap kali hasil kali jumlah dan harga ditambahkan, keluar tujuh baris tanpa header, dan 886.3 pada baris terakhir adalah total keseluruhan.

awk -F, 'NR > 1 {t += $3 * $4; print NR, t}' sales.csv
2 90
3 189.5
4 378.5
5 423.5
6 468.5
7 508.3
8 886.3

Rata-rata dihitung di END dengan membagi jumlah total dengan jumlah baris. Jumlah lima skor adalah 343 dan rata-ratanya 68.6.

awk '{total += $3; n++} END {print total, n, total / n}' scores.txt
343 5 68.6

BEGIN dipakai untuk menampilkan baris header sekali di atas hasil. Di atas item dan nilai (jumlah × harga satuan), baris item total hanya muncul sekali.

awk -F, 'BEGIN {print "item", "total"} NR > 1 {print $2, $3 * $4}' sales.csv
item total
keyboard 90
mouse 99.5
monitor 189
keyboard 45
cable 45
mouse 39.8
monitor 378

Pemisah output diubah dengan variabel OFS di BEGIN. Jika OFS diisi koma, di tempat koma pada print masuk koma alih-alih spasi, sehingga daftar akun keluar dalam bentuk CSV.

awk 'BEGIN {FS = ":"; OFS = ","} {print $1, $3, $7}' users.txt
root,0,/bin/bash
bin,1,/sbin/nologin
daemon,2,/sbin/nologin
nobody,65534,/sbin/nologin
user,1000,/bin/bash
deploy,1001,/bin/bash
backup,1002,/sbin/nologin

Untuk merapikan kolom, gunakan printf. %-10s adalah string rata kiri 10 karakter, %3d adalah bilangan bulat 3 karakter, dan %8.2f adalah angka 8 karakter dengan dua desimal.

awk -F, 'NR > 1 {printf "%-10s %8.2f\n", $2, $3, $3 * $4}' sales.csv
keyboard     2    90.00
mouse        5    99.50
monitor      1   189.00
keyboard     1    45.00
cable       10    45.00
mouse        2    39.80
monitor      2   378.00

Berbeda dengan print, printf tidak berganti baris, jadi tulis [\n] di akhir format. Tanpa [\n], nama item tersambung dalam satu baris.

awk -F, 'NR > 1 {printf "%s ", $2}' sales.csv
keyboard mouse monitor keyboard cable mouse monitor

5️⃣ Analisis log dan opsi perintah awk

  • ↪️ Penghitungan IP klien dan kode status, ringkasan opsi

🔲 Analisis log

Menambahkan ke satu variabel hanya menghasilkan satu total, jadi untuk menghitung per IP klien atau per kode status, kumpulkan nilai dalam array. n[$1]++ menambah 1 pada elemen array berkunci IP, dan for (ip in n) di END mengeluarkan elemen yang terkumpul satu per satu.

awk '{n[$1]++} END {for (ip in n) print n[ip], ip}' access.log | sort -rn
4 192.0.2.10
3 203.0.113.25
3 198.51.100.7
2 192.0.2.44

Urutan keluaran for (ip in n) tidak ditentukan (menurut manual GNU Awk), jadi kami mengurutkannya berdasarkan jumlah permintaan dengan sort -rn. 192.0.2.10 terbanyak dengan 4 permintaan.

Jumlah per kode status dihitung dengan cara yang sama. Ada 3 kali 404 dan 1 kali 500.

awk '{n[$9]++} END {for (s in n) print s, n[s]}' access.log | sort
200 6
301 1
304 1
404 3
500 1

Mengambil kode status saja lalu mengirimnya ke sort dan uniq -c juga menghasilkan jumlah yang sama.

awk '{print $9}' access.log | sort | uniq -c
      6 200
      1 301
      1 304
      3 404
      1 500

Untuk melihat respons kesalahan saja, beri kondisi pada kode status. Baris dengan kode 400 ke atas adalah tiga permintaan yang mencari wp-login.php dan .env serta satu kesalahan 500.

awk '$9 >= 400 {print $9, $1, $7}' access.log
404 203.0.113.25 /wp-login.php
404 203.0.113.25 /wp-login.php
404 203.0.113.25 /.env
500 198.51.100.7 /api/search?q=awk

Total byte terkirim per IP juga dihitung dengan menambahkan ke array. 192.0.2.10 menerima paling banyak, yaitu 31340 byte.

awk '{b[$1] += $10} END {for (ip in b) print b[ip], ip}' access.log | sort -rn
31340 192.0.2.10
5120 192.0.2.44
4250 198.51.100.7
588 203.0.113.25

Field waktu ($4) bisa dibandingkan sebagai string. Di antara baris dengan tanggal dan format yang sama, urutan string sama dengan urutan waktu, jadi kami hanya memilih empat permintaan dari 00:05 sampai sebelum 00:10.

awk '$4 >= "[29/Oct/2026:00:05" && $4 < "[29/Oct/2026:00:10" {print $4, $7}' access.log
[29/Oct/2026:00:05:30 /contact.html
[29/Oct/2026:00:07:02 /old-page.html
[29/Oct/2026:00:07:15 /.env
[29/Oct/2026:00:09:48 /index.html

🔲 Opsi perintah awk

📌 Opsi utama: hasil dari artikel ini

OpsiFungsiHasil di artikel ini
-F fsMenentukan pemisah field input-F: memisahkan nama akun ($1) dan shell login ($7) pada users.txt, -F, menampilkan item dan jumlah dari sales.csv bersama header (item qty)
-v var=valMemberi nilai pada variabel sebelum program berjalanMengirim variabel shell min dengan -v min=$min menampilkan enam baris dengan byte terkirim 1000 ke atas, dengan -v FPAT=… kolom bertanda kutip pada quoted.csv keluar sebagai satu field
-i inplaceMenyimpan output ke file asli, bukan ke layarSetelah gawk -i inplace, tidak ada yang muncul di layar dan salinan scores.txt berubah menjadi dua kolom, nama dan skor, jika -v inplace::suffix=.bak ditambahkan, isi sebelumnya tersimpan di file .bak
--versionMenampilkan informasi versiBaris pertama [awk --version] menampilkan versi GNU Awk 5

📎 Opsi lainnya: menurut manual resmi

OpsiFungsi
-f program-fileMembaca program AWK dari file, bukan dari argumen baris perintah pertama, -f bisa diberikan beberapa kali
-e program-textMemakai teks di baris perintah sebagai sumber program AWK, bisa dipakai bersama fungsi pustaka yang dimuat -f atau --include
-E fileMirip -f, tetapi diproses terakhir dan mencegah penugasan variabel di baris perintah, untuk skrip #!
--traditionalBerjalan dalam mode kompatibilitas, tidak mengenali ekstensi GNU
--posixMengaktifkan mode kompatibilitas dengan batasan tambahan, misalnya tidak mengenali func, sinonim function
--lintMemperingatkan konstruksi yang meragukan atau sulit dipindahkan ke implementasi AWK lain, dengan --lint=fatal peringatan menjadi kesalahan fatal
--dump-variablesMenulis daftar terurut variabel global beserta tipe dan nilai akhirnya ke file, jika file tidak ditentukan menjadi awkvars.out

🔲 Simulator perintah awk

Di simulator di bawah ini, Anda bisa mengetik perintah awk sendiri pada file uji yang sama.

Simulator perintah awkGNU Awk 5
[root@server work]#
Interpreter awk kecil yang hanya berjalan di browser Anda. Empat file uji sama dengan yang dipakai saat pengukuran, dan ↑↓ memanggil kembali perintah sebelumnya.

🔢 FAQ & Konten yang Direkomendasikan

$min di dalam tanda kutip tunggal tidak diubah shell dan sampai ke awk apa adanya, jadi kirim dengan opsi -v. Jika variabel shell min diisi 1000 lalu dikirim dengan -v min=$min, keluar enam baris dengan byte terkirim 1000 ke atas. Jika program awk diapit tanda kutip ganda, shell lebih dulu mengganti bahkan $1 pada [print $1] dengan nilai kosong, sehingga seluruh baris ditampilkan.

Dengan -i inplace, GNU Awk menyimpan output ke file asli, bukan ke layar. Saat program yang menampilkan field pertama dan ketiga dijalankan pada salinan scores.txt dengan gawk -i inplace, tidak ada yang muncul di layar dan file berubah menjadi dua kolom, nama dan skor. Karena file asli langsung ditimpa, menambahkan -v inplace::suffix=.bak menyimpan isi sebelumnya di file .bak.

Di server AlmaLinux 9, /usr/bin/awk adalah tautan simbolis ke gawk, dan baris pertama [awk --version] menampilkan versi GNU Awk 5. Di server ini, kedua nama menjalankan program yang sama. Sebelum memakai fitur GNU Awk seperti -i inplace atau FPAT, pastikan dengan [awk --version] bahwa itu GNU Awk.

ℹ️ Pemberitahuan Afiliasi
Konten di situs ini berisi tautan afiliasi. Jika pengunjung membeli produk atau layanan melalui tautan tersebut, situs ini menerima komisi dari penjual. Harga yang dibayar pembeli(turun saat ada diskon promo ↓), tidak naik karena hal ini. Harga, diskon, dan informasi stok yang ditampilkan berlaku pada saat penulisan dan bisa berbeda dengan kondisi sebenarnya, jadi pastikan kembali di situs penjual sebelum membeli. Pemilihan dan penilaian produk dibuat berdasarkan standar kami sendiri, dan ada tidaknya komisi tidak memengaruhi urutan maupun isi penilaian.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

Buktikan bahwa Anda manusia: 3   +   10   =