Perintah awk: Menampilkan Field, Pemisah -F, dan Pola Kondisi
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
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.txtalice pass 82
bob fail 47
carol pass 91
dave pass 68
erin fail 55Kurung 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.txtalice 82
bob 47
carol 91
dave 68
erin 55Jika 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.txtalice82
bob47
carol91
dave68
erin55NR 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.txt1 3 82
2 3 47
3 3 91
4 3 68
5 3 55Log akses server web juga dipisahkan spasi, jadi field dipilih dengan cara yang sama. Nomor field pada baris pertama log uji adalah sebagai berikut.
| Field | Nilai pada baris pertama | Arti |
|---|---|---|
| $1 | 192.0.2.10 | IP klien |
| $4 | [29/Oct/2026:00:01:12 | Tanggal dan waktu permintaan |
| $6 | "GET | Metode permintaan (diawali tanda kutip ganda) |
| $7 | /index.html | URL permintaan |
| $9 | 200 | Kode status |
| $10 | 5120 | Byte 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.log192.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 200Kolom 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 -315 x86_64)"
15 x86_64)"
15 x86_64)"2️⃣ Menentukan pemisah dengan awk -F
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.txtroot: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/nologinPemisah 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.txtroot /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
nobody /sbin/nologin
user /bin/bash
deploy /bin/bash
backup /sbin/nologinFile 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.csvitem 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.csvitem
"cable
keyboardUntuk 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.csvitem
"cable, usb"
keyboardUntuk 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.txtroot bash
bin nologin
daemon nologin
nobody nologin
user bash
deploy bash
backup nologin3️⃣ Pola kondisi perintah awk
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.log203.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 404Nilai 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.log203.0.113.25 /wp-login.php
203.0.113.25 /wp-login.php
203.0.113.25 /.envSaat membandingkan dengan string, apit nilainya dengan tanda kutip ganda. Kami memilih hanya nama yang field keduanya pass.
awk '$2 == "pass" {print $1}' scores.txtalice
carol
davePerbandingan 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.txtnobody 65534
user 1000
deploy 1001
backup 1002Dua 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.txtuser /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.txtroot
user
deployawk -F: '$7 !~ /nologin/ {print $1, $7}' users.txtroot /bin/bash
user /bin/bash
deploy /bin/bashKondisi 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.csvkeyboard 2
mouse 5
monitor 1
keyboard 1
cable 10
mouse 2
monitor 2Output 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.txtDengan 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.txt4️⃣ awk BEGIN, END, jumlah, dan rata-rata
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.
$ awk -F, 'NR > 1 {t += $3 * $4} END {printf "total %.2f\n", t}' sales.csvJumlah 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.log41298Jika 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.csv2 90
3 189.5
4 378.5
5 423.5
6 468.5
7 508.3
8 886.3Rata-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.txt343 5 68.6BEGIN 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.csvitem total
keyboard 90
mouse 99.5
monitor 189
keyboard 45
cable 45
mouse 39.8
monitor 378Pemisah 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.txtroot,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/nologinUntuk 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.csvkeyboard 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.00Berbeda 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.csvkeyboard mouse monitor keyboard cable mouse monitor5️⃣ Analisis log dan opsi perintah awk
🔲 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 -rn4 192.0.2.10
3 203.0.113.25
3 198.51.100.7
2 192.0.2.44Urutan 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 | sort200 6
301 1
304 1
404 3
500 1Mengambil 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 500Untuk 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.log404 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=awkTotal 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 -rn31340 192.0.2.10
5120 192.0.2.44
4250 198.51.100.7
588 203.0.113.25Field 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
| Opsi | Fungsi | Hasil di artikel ini |
|---|---|---|
| -F fs | Menentukan 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=val | Memberi nilai pada variabel sebelum program berjalan | Mengirim 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 inplace | Menyimpan output ke file asli, bukan ke layar | Setelah 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 |
| --version | Menampilkan informasi versi | Baris pertama [awk --version] menampilkan versi GNU Awk 5 |
📎 Opsi lainnya: menurut manual resmi
| Opsi | Fungsi |
|---|---|
| -f program-file | Membaca program AWK dari file, bukan dari argumen baris perintah pertama, -f bisa diberikan beberapa kali |
| -e program-text | Memakai teks di baris perintah sebagai sumber program AWK, bisa dipakai bersama fungsi pustaka yang dimuat -f atau --include |
| -E file | Mirip -f, tetapi diproses terakhir dan mencegah penugasan variabel di baris perintah, untuk skrip #! |
| --traditional | Berjalan dalam mode kompatibilitas, tidak mengenali ekstensi GNU |
| --posix | Mengaktifkan mode kompatibilitas dengan batasan tambahan, misalnya tidak mengenali func, sinonim function |
| --lint | Memperingatkan konstruksi yang meragukan atau sulit dipindahkan ke implementasi AWK lain, dengan --lint=fatal peringatan menjadi kesalahan fatal |
| --dump-variables | Menulis 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.
🔢 FAQ & Konten yang Direkomendasikan
Pengurutan
Perintah sort Linux: mengurutkan file
Perintah sort mengurutkan isi file menurut abjad atau angka. Gunakan setelahnya untuk melihat total awk dari yang terbesar.
Hapus duplikat
Perintah uniq Linux
Perintah uniq merapatkan baris sama yang berurutan menjadi satu dan, dengan -c, menghitung berapa kali terulang.
Melihat file
Perintah head dan perintah tail Linux
Perintah head dan tail hanya menampilkan beberapa baris pertama atau terakhir file. Sering dipakai untuk memeriksa log akses server.
ℹ️ 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.