Record, Field, dan Pemisah Kustom dalam awk
Atur pemisah field input dan output untuk memecah baris CSV, TSV, dan log menjadi kolom yang rapi.
Record, Field, dan Pemisah Kustom dalam awk adalah pelajaran DevOps Bootcamp gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar DevOps Bootcamp, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus DevOps Bootcamp mencakup 4 pelajaran total.
Apa Itu Rekaman dan Bidang dalam awk?
awk membaca masukan baris demi baris. Setiap baris disebut rekaman, dan setiap bagian yang dipisahkan spasi dalam baris tersebut disebut bidang.
$0— seluruh rekaman saat ini (baris lengkap)$1— bidang pertama$2— bidang kedua$NF— bidang terakhir (NF= jumlah bidang)
Secara bawaan, awk memisahkan bidang berdasarkan rangkaian spasi apa pun (spasi atau tab). Hal ini membuatnya langsung berguna untuk mengurai log, keluaran perintah, dan data yang dipisahkan spasi.
#!/usr/bin/env bash
# Show how awk sees records and fields
echo 'alice 30 engineer' | awk '{ print "Name:", $1, "Age:", $2, "Role:", $3 }'
# $NF is always the last field — regardless of how many there are
echo 'one two three four five' | awk '{ print "Last field:", $NF }'Pemisah Bidang Masukan: FS
Variabel bawaan FS (Pemisah Bidang) memberi tahu awk cara membagi setiap rekaman menjadi bidang. Nilai bawaannya adalah satu spasi, yang mengaktifkan mode pemisahan berdasarkan spasi.
Anda dapat mengatur FS dengan dua cara:
- Dengan tanda
-Fpada baris perintah:awk -F':' - Di dalam blok
BEGIN:BEGIN { FS = ":" }
Keduanya setara. Pendekatan blok BEGIN lebih disarankan dalam skrip yang panjang karena konfigurasi tetap berada di dalam skrip, sehingga lebih mudah dibaca dan portabel.
#!/usr/bin/env bash
# Parse /etc/passwd using ':' as the field separator
# Field 1 = username, field 3 = UID, field 7 = shell
echo 'root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin' \
| awk -F':' '{ print $1, "UID="$3, "shell="$7 }'Mengatur FS dalam Blok BEGIN
Untuk skrip yang lebih panjang daripada satu baris perintah, menempatkan FS di dalam blok BEGIN adalah praktik standar. Blok BEGIN berjalan sebelum awk membaca masukan apa pun, sehingga pemisah sudah siap untuk rekaman pertama.
Pola ini juga memungkinkan Anda mengatur beberapa variabel sekaligus, menambahkan komentar, dan menjaga logika tetap mandiri dalam berkas skrip.
Pemisah umum yang akan Anda temui dalam praktik:
- Titik dua
:—/etc/passwd,/etc/shadow - Tab
\t— ekspor TSV, keluaran kompiler - Koma
,— berkas CSV (sederhana, tanpa bidang berkutip) - Pipa
|— beberapa format log, pencadangan basis data
#!/usr/bin/env bash
# awk script using BEGIN to set FS for TSV input
printf 'alice\t30\tengineer\nbob\t25\tdesigner\ncarol\t35\tmanager\n' \
| awk 'BEGIN { FS = "\t" } { printf "%-10s age=%-3s role=%s\n", $1, $2, $3 }'Mengurai Berkas CSV dengan awk
CSV (nilai yang dipisahkan koma) adalah salah satu format data yang paling umum dalam rekayasa shell. Mengatur FS="," membuat awk memperlakukan koma sebagai pembatas.
Catatan penting: penanganan CSV bawaan awk tidak memperhitungkan bidang berkutip yang mengandung koma (misalnya, "Smith, John"). Untuk CSV sederhana tanpa koma berkutip, cara ini bekerja dengan sempurna. Untuk CSV yang memenuhi RFC 4180 dan memiliki bidang berkutip, gunakan pengurai CSV yang tepat atau miller/csvkit.
Tugas umum di dunia nyata adalah mengekstrak kolom tertentu dan menyaring baris berdasarkan nilai — keduanya mudah dilakukan dengan awk setelah FS diatur.
#!/usr/bin/env bash
# Simple CSV: extract name and salary columns, filter salary > 50000
data='name,department,salary
alice,engineering,95000
bob,marketing,48000
carol,engineering,112000
dave,hr,45000'
echo "$data" | awk -F',' '
NR == 1 { next } # skip header row
$3 > 50000 { print $1, "earns", $3 }
'Pemisah Bidang Multi-Karakter dan Regex
FS dalam awk tidak terbatas pada satu karakter — nilainya dapat berupa ekspresi reguler. Ini sangat berguna untuk format log di dunia nyata yang bidangnya dipisahkan oleh pembatas dengan panjang yang bervariasi.
Contoh pemisah regex:
FS = "[,;]"— memisahkan berdasarkan koma atau titik komaFS = "[ \t]+"— memisahkan berdasarkan satu atau beberapa spasi/tab (sama seperti bawaan, tetapi ditulis secara eksplisit)FS = "::"— memisahkan berdasarkan titik dua ganda literalFS = "\\|"— memisahkan berdasarkan karakter pipa (harus di-escape)
Saat FS berupa regex, awk (gawk) memperlakukannya sebagai pola, bukan string literal.
#!/usr/bin/env bash
# Log lines with mixed delimiters: split on " | " or "::" or ","
# Here we split on one or more spaces or pipe characters
printf '2024-01-15 | ERROR | disk full | /dev/sda1\n2024-01-15 | INFO | startup ok | main\n' \
| awk -F' \\| ' '{ printf "date=%-12s level=%-6s msg=%s\n", $1, $2, $3 }'
# Split on multiple possible delimiters using character class
echo 'alpha,beta;gamma,delta;epsilon' \
| awk -F'[,;]' '{ for(i=1; i<=NF; i++) print i": "$i }'Pemisah Bidang Keluaran: OFS
OFS (Pemisah Bidang Keluaran) mengatur apa yang ditempatkan awk di antara bidang saat Anda menyusun ulang rekaman dengan print. Nilai bawaannya adalah satu spasi.
Hal pentingnya: OFS hanya disisipkan di antara bidang saat Anda menggunakan sintaks koma dalam print atau saat menetapkan nilai ke suatu bidang dan awk membangun ulang $0. Jika Anda menggabungkan dengan spasi dalam kode sumber, OFS tidak digunakan.
print $1, $2, $3— koma memicu OFS di antara bidangprint $1 " " $2— spasi eksplisit, OFS diabaikan
Pola umum: baca CSV, ubah, lalu tulis TSV dengan mengatur FS="," dan OFS="\t".
#!/usr/bin/env bash
# Convert CSV to TSV using FS and OFS
data='alice,30,engineer
bob,25,designer
carol,35,manager'
echo "$data" | awk 'BEGIN { FS=","; OFS="\t" } { print $1, $2, $3 }'
echo '---'
# OFS also applies when you modify a field — awk rebuilds $0 with OFS
echo 'alice,30,engineer' | awk 'BEGIN { FS=","; OFS=" | " } { $1=$1; print $0 }'Memaksa awk Membangun Ulang $0 dengan OFS
Ada trik yang halus tetapi penting: menetapkan nilai ke bidang apa pun (bahkan menetapkan bidang ke dirinya sendiri, $1=$1) memaksa awk untuk membangun ulang $0 dengan menggabungkan semua bidang menggunakan OFS.
Ini adalah cara idiomatis untuk memformat ulang pembatas rekaman tanpa mencetak setiap bidang secara manual:
- Atur
FSke pembatas masukan - Atur
OFSke pembatas keluaran yang diinginkan - Picu pembangunan ulang dengan
$1=$1 - Cetak
$0
Pendekatan ini dapat menangani jumlah bidang apa pun dan menghindari penulisan $1, $2, $3, ... secara tetap.
#!/usr/bin/env bash
# Reformat a pipe-delimited file to comma-separated WITHOUT listing every field
printf 'alice|30|engineer|london\nbob|25|designer|paris\ncarol|35|manager|berlin\n' \
| awk 'BEGIN { FS="|"; OFS="," } { $1=$1; print $0 }'
# Useful when you don't know how many fields there are:
printf 'a|b|c|d|e|f|g\n1|2|3|4|5|6|7\n' \
| awk 'BEGIN { FS="|"; OFS="\t" } { $1=$1; print $0 }'Pemisah Rekaman: RS
Sama seperti FS yang memisahkan bidang dalam sebuah rekaman, RS (Pemisah Rekaman) menentukan pemisah antarrekanan. Secara default, RS adalah newline, sehingga awk memproses satu baris pada satu waktu.
Mengubah RS memungkinkan pemrosesan rekaman multibaris yang sangat bermanfaat:
RS=""— mode paragraf: baris kosong memisahkan rekaman (bidang dapat mencakup beberapa baris)RS=";"— memisahkan berdasarkan titik koma (berguna untuk dump SQL)RS="\n"— newline eksplisit (default)
Dalam mode paragraf (RS=""), FS tetap digunakan untuk memisahkan bidang dalam rekaman multibaris, dan newline di dalam rekaman juga otomatis diperlakukan sebagai pemisah bidang.
#!/usr/bin/env bash
# Paragraph mode: each blank-line-separated block is one record
# Useful for processing structured text blocks (e.g., stanzas, config sections)
data='Name: Alice
Role: Engineer
City: London
Name: Bob
Role: Designer
City: Paris'
echo "$data" | awk 'BEGIN { RS=""; FS="\n" } {
print "Record", NR":"
for (i=1; i<=NF; i++) print " ", $i
print ""
}'Pemisah Rekaman Keluaran: ORS
ORS (Pemisah Rekaman Keluaran) dicetak setelah setiap pernyataan print. Secara default, nilainya adalah newline (\n), sehingga setiap print menghasilkan baris baru.
Mengubah ORS memungkinkan Anda:
- Menggabungkan rekaman menjadi satu baris:
ORS=" " - Menambahkan baris kosong di antara rekaman keluaran:
ORS="\n\n" - Membuat format keluaran khusus seperti fragmen JSON atau XML
Perhatikan bahwa printf tidak menggunakan ORS — ORS hanya berlaku untuk pernyataan print sederhana. Gunakan printf jika Anda memerlukan kendali penuh atas pemformatan.
#!/usr/bin/env bash
# Join all matching lines onto one line by setting ORS to a space
printf 'apple\nbanana\ncherry\ndate\n' | awk '{ ORS=" " } { print $0 }'
echo # final newline
# Add a blank line after every output record for readability
printf 'alice 30 engineer\nbob 25 designer\ncarol 35 manager\n' \
| awk 'BEGIN { ORS="\n\n" } { print $1, "is a", $3 }'Contoh Praktis: Mengurai Catatan Akses Apache
Catatan akses Apache/nginx memiliki format yang sudah dikenal, dengan bidang yang dipisahkan spasi. Beberapa bidang (seperti cap waktu) mengandung spasi dan diapit tanda kurung siku atau tanda kutip — sehingga pemisahan bidang awk secara langsung menjadi rumit.
Pendekatan praktisnya adalah menggunakan FS berupa ekspresi reguler yang memperhitungkan strukturnya, atau mengekstrak bidang tertentu berdasarkan posisi setelah mengetahui format yang tepat.
Bidang dalam Format Catatan Gabungan secara umum adalah:
- IP Klien
- Ident (biasanya
-) - Pengguna autentikasi (biasanya
-) - Cap waktu (di dalam tanda kurung siku, dihitung sebagai satu token)
- Metode+jalur+protokol permintaan (di dalam tanda kutip)
- Kode status HTTP
- Byte respons
#!/usr/bin/env bash
# Parse a simulated Apache Combined Log Format line
# Extract: IP, status code, bytes, and request path
logs='192.168.1.10 - alice [15/Jan/2024:10:23:45 +0000] "GET /api/users HTTP/1.1" 200 1523
10.0.0.5 - - [15/Jan/2024:10:23:46 +0000] "POST /login HTTP/1.1" 401 89
172.16.0.3 - bob [15/Jan/2024:10:23:47 +0000] "GET /dashboard HTTP/1.1" 200 8741'
echo "$logs" | awk '{
ip = $1
status = $9
bytes = $10
# Extract the request path from the quoted string in field 7
split($7, parts, "/")
path = "/" parts[2]
printf "ip=%-15s status=%s bytes=%-6s endpoint=%s\n", ip, status, bytes, path
}'Menggabungkan FS, OFS, RS, dan ORS dalam Alur
Dalam rekayasa shell nyata, Anda jarang menggunakan pemisah ini secara terpisah. Pola alur yang umum adalah menggunakan awk sebagai pengonversi format di tengah alur, dengan mengubah satu format terstruktur menjadi format lainnya.
Hal penting saat menggabungkan pemisah:
- Selalu tetapkan
FSdanOFSsecara bersamaan dalamBEGINsaat mengonversi format - Gunakan
$1=$1untuk memicu pembangunan ulang$0jika Anda ingin semua bidang diformat ulang tanpa mencantumkannya satu per satu - Ubah
RShanya jika rekaman Anda benar-benar mencakup beberapa baris - Gunakan
ORSuntuk mengendalikan spasi antarrekanan keluaran - Utamakan
printfuntuk pemformatan yang presisi; gunakanprintjika penghentian otomatis olehORSmemudahkan
#!/usr/bin/env bash
# Full pipeline: read a colon-delimited file,
# filter rows where field 3 (UID) >= 1000 (real users),
# then output as tab-separated: username, UID, home dir
echo 'root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
alice:x:1001:1001:Alice:/home/alice:/bin/bash
bob:x:1002:1002:Bob:/home/bob:/bin/zsh
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin' \
| awk 'BEGIN { FS=":"; OFS="\t" } $3 >= 1000 { print $1, $3, $6 }'Pemeriksaan Pemahaman: OFS dan Pembangunan Ulang Bidang
Uji pemahaman Anda tentang cara OFS berinteraksi dengan penetapan bidang dalam awk.
Ringkasan Pelajaran: Rekaman, Bidang, dan Pemisah
Sekarang Anda memiliki kendali penuh atas cara awk membaca dan menulis data terstruktur. Berikut ringkasan keempat variabel pemisah:
FS— Pemisah Bidang Masukan. Tetapkan dengan-Fatau dalamBEGIN. Dapat berupa karakter, string, atau ekspresi reguler. Default: spasi putih.OFS— Pemisah Bidang Keluaran. Disisipkan di antara bidang dalam pemanggilanprint $1, $2dan saat awk membangun ulang$0setelah penetapan bidang. Default: satu spasi.RS— Pemisah Rekaman Masukan. Menentukan pemisah antarrekanan (baris). Default: newline. Tetapkan ke string kosong untuk mode paragraf.ORS— Pemisah Rekaman Keluaran. Ditambahkan setelah setiapprint. Default: newline. Ubah untuk menggabungkan baris atau menambahkan spasi.
Pola terpenting yang perlu diingat: tetapkan FS dan OFS dalam BEGIN, lalu gunakan $1=$1 untuk membangun ulang $0 kapan pun Anda ingin memformat ulang pembatas di seluruh bidang tanpa menetapkan posisi bidang secara tetap. Pola ini berfungsi untuk berkas dengan jumlah kolom berapa pun dan menjadi dasar alur konversi format berbasis awk.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Record, Field, dan Pemisah Kustom dalam awk” gratis?
Ya — teks lengkap “Record, Field, dan Pemisah Kustom dalam awk” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus DevOps Bootcamp, upgrade ke CoddyKit PRO. Kursus DevOps Bootcamp mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Record, Field, dan Pemisah Kustom dalam awk”?
Atur pemisah field input dan output untuk memecah baris CSV, TSV, dan log menjadi kolom yang rapi. Kamu berlatih DevOps Bootcamp dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai DevOps Bootcamp?
Tidak diperlukan pengalaman sebelumnya. DevOps Bootcamp di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Record, Field, dan Pemisah Kustom dalam awk” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran DevOps Bootcamp ini?
Ya. Setiap pelajaran DevOps Bootcamp menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Record, Field, dan Pemisah Kustom dalam awk
- Pola, Rentang, dan Blok BEGIN/END
- Agregasi dengan Array dan Pengelompokan awk
- Fungsi awk, Pemformatan printf, dan Pembuatan Laporan