Menguasai perintah inti pemrosesan teks Linux — grep, sort, uniq, cut, wc, tr, sed, dan awk — hingga praktik nyata mem-parsing log akses web server untuk menemukan IP paling sering mengunjungi situs.

Setelah di episode 5 sebelumnya kita membahas pipeline, redirection, dan I/O streams — bagaimana cara mengarahkan output perintah dan merangkainya dengan | — pada episode kali ini kita akan mengisi "bahan bakar" dari pipeline tersebut: perintah-perintah pemrosesan teks. Pipeline tanpa filter ibarat mesin tanpa bahan bakar: bisa tersambung, tapi tidak menghasilkan apa pun.
Kenapa topik ini krusial? Karena di Linux, hampir semuanya adalah teks. Log aplikasi adalah teks, konfigurasi adalah teks, output perintah adalah teks, bahkan API internal sistem diekspos sebagai teks. Kemampuan untuk menyaring (grep), mengurutkan (sort), meringkas (uniq -c), memotong kolom (cut), dan mengekstrak pola (sed, awk) dari teks adalah keterampilan yang membedakan admin yang "mengetik perintah" dari admin yang "memecahkan masalah".
Di episode ini kita akan membahas: pertama, grep sebagai mesin pencari teks; kedua, sort dan uniq untuk mengurutkan dan meringkas; ketiga, cut, wc, dan tr untuk memotong dan mengukur; keempat, sed dan awk sebagai editor streaming dan pelapor kolom; kelima, find, locate, dan xargs untuk menemukan dan mengeksekusi; terakhir, studi kasus nyata mem-parsing log akses web server.
grep: Mesin Pencari Teksgrep (global regular expression print) membaca input dan menampilkan hanya baris yang cocok dengan pola. Ini filter paling dasar dan paling sering dipakai. Mari mulai dari opsi paling penting:
| Opsi | Fungsi |
|---|---|
-i | Abaikan perbedaan huruf besar/kecil |
-v | Balikkan: tampilkan baris yang tidak cocok |
-n | Tampilkan nomor baris |
-r | Cari secara rekursif ke dalam direktori |
-E | Aktifkan extended regex (pola lanjutan) |
-c | Hitung jumlah baris yang cocok |
-w | Cocokkan kata utuh, bukan sebagian |
grep -i error /var/log/syslog
grep -v "^#" /etc/ssh/sshd_config
grep -rn "Listen" /etc/nginx/Contoh di atas menggambarkan tiga pola pemakaian umum: mencari error di log dengan mengabaikan kapitalisasi (-i), membuang baris komentar dari file konfigurasi (-v "^#"), dan mencari kata Listen di seluruh direktori NGINX sambil menampilkan nama file dan nomor baris (-rn).
Note
grep -v adalah kebalikan grep — ia adalah filter pembuang. Sangat berguna untuk membersihkan noise: misalnya mengecualikan komentar (grep -v "^#") dan baris kosong (grep -v "^$") dari file konfigurasi sehingga yang tersisa hanya konfigurasi aktif. Kombinasi grep -v -e '^#' -e '^$' adalah idiom klasik para sysadmin.
-EPola dasar grep sudah mendukung regex, tetapi untuk alternasi (|) dan beberapa metakarakter lain, kalian butuh -E. Perhatikan diff berikut — sebelum dan sesudah memakai extended regex:
grep -E "error|fatal|panic" /var/log/app.log
grep -E "^(error|fatal|panic)" /var/log/app.logBaris pertama mencari baris yang mengandung salah satu dari tiga kata di posisi mana pun; baris kedua hanya baris yang diawali salah satu dari tiga kata. Perhatikan bahwa egrep adalah alias lama untuk grep -E — jangan biasakan egrep, karena ia dianggap usang dan tidak ada di semua sistem.
sort dan uniq: Mengurutkan dan Meringkassort mengurutkan baris teks. Secara default ia mengurutkan secara leksikografis (seperti kamus), sehingga 10 akan muncul sebelum 9. Untuk data angka, gunakan -n:
Opsi sort | Fungsi |
|---|---|
-n | Urutkan secara numerik (bukan kamus) |
-r | Urutkan terbalik (descending) |
-k2 | Urutkan berdasarkan kolom/field ke-2 |
-u | Buang baris duplikat setelah diurutkan |
uniq menghapus baris yang berdekatan dan sama. Kata kuncinya: berdekatan. Jika duplikat tidak bersebelahan, uniq tidak akan menghapusnya — itulah mengapa pola standarnya selalu sort | uniq, bukan uniq sendirian.
cat kata.txt
sort kata.txt | uniq -c
sort kata.txt | uniq -c | sort -rnBaris ketiga adalah idiom yang sangat berharga: sort | uniq -c | sort -rn menghasilkan frekuensi kemunculan setiap baris, diurutkan dari yang paling sering. uniq -c memberi prefix jumlah kemunculan, lalu sort -rn mengurutkan secara numerik terbalik sehingga angka terbesar di atas. Kita akan memakai idiom persis ini di studi kasus log nanti.
cut, wc, dan tr: Memotong, Mengukur, dan Mengubahcut memotong bagian tertentu dari setiap baris. Konsep kuncinya: delimiter (-d) adalah karakter pemisah kolom, dan field (-f) adalah kolom yang diambil.
cut -d: -f1 /etc/passwd
cut -d: -f1,7 /etc/passwdContoh pertama menampilkan nama user (kolom 1 dari /etc/passwd yang dipisah titik dua); contoh kedua menampilkan kolom 1 dan 7 (user beserta shell default-nya).
wc (word count) menghitung sesuatu dalam input — baris (-l), kata (-w), atau karakter (-c):
wc -l /etc/passwd
echo "satu dua tiga" | wc -wtr (translate) mengganti atau menghapus karakter. Ia bekerja per-karakter, bukan per-kata:
cut -d: -f1,7 /etc/passwd | tr ':' ' 'Di sini tr ':' ' ' mengganti setiap titik dua dengan spasi — teknik kecil yang mengubah output ber-delimiter menjadi kolom yang enak dibaca.
sed: Editor Streaming untuk Find & Replacesed (stream editor) membaca baris demi baris dan melakukan transformasi. Operasi paling populer adalah substitusi s/pola/pengganti/opsi:
sed 's/localhost/127.0.0.1/' config.txt
sed 's/error/ERROR/g' app.logTanpa opsi g (global), sed hanya mengganti kemunculan pertama di tiap baris; dengan g, semua kemunculan diganti. Pola ini menyerupai find & replace editor teks — bedanya, ia bekerja pada aliran data dan bisa masuk ke pipeline.
sed -n '5,10p' config.txt-n menekan output default, dan 5,10p mencetak baris 5 sampai 10 — cara cepat "melihat sebagian file" tanpa membuka seluruhnya.
Caution
sed -i mengedit file langsung di tempat (in-place) tanpa backup. Satu salah ketik pada pola bisa mengubah seluruh file tanpa bisa dikembalikan. Selalu jalankan sed tanpa -i dulu untuk melihat hasilnya, lalu ulangi dengan -i. Untuk file penting, gunakan sed -i.bak yang otomatis membuat salinan file.bak sebelum diubah.
awk: Pemrosesan Kolom & Pelaporanawk adalah bahasa pemrograman kecil yang dirancang khusus untuk memproses teks berkolom. Untuk admin, cukup tiga kemampuan inti: memilih kolom ($1, $2, ...), kondisi (if), dan akumulasi (variabel counter).
awk '{print $1}' /etc/passwd
awk -F: '{print $1, $7}' /etc/passwdPerhatikan: awk '{print $1}' mengambil field pertama yang dipisah spasi; -F: mengubah delimiter menjadi titik dua, sama seperti cut -d:. Perbedaan kunci dari cut: awk bisa melakukan perhitungan dan kondisional di dalamnya:
awk '{ if (NF > 3) print NR": "$0 }' file.txtContoh ini mencetak baris yang memiliki lebih dari 3 field (NF = number of fields), disertai nomor baris (NR). Inilah yang membuat awk jadi "senjata andalan" saat kondisi filtering sudah terlalu kompleks untuk grep.
find, locate, dan xargs: Menemukan & Mengeksekusifind mencari file berdasarkan atribut — nama, ukuran, waktu modifikasi — dan bisa langsung mengeksekusi perintah pada setiap hasil:
find /var/log -name "*.log" -mtime -7
find /home -type f -size +100MBaris pertama menemukan file .log yang dimodifikasi dalam 7 hari terakhir; baris kedua menemukan file berukuran lebih dari 100 MB di bawah /home. Bandingkan dengan locate, yang mencari melalui database indeks (bukan menelusuri direktori), sehingga jauh lebih cepat — tetapi database tersebut diperbarui oleh updatedb, jadi file yang baru dibuat belum tentu terlihat.
xargs mengubah output standar menjadi argumen untuk perintah lain. Ini jembatan antara "teks output" dan "parameter command":
find /var/log -name "*.log" | xargs grep "ERROR"find menemukan semua file log, lalu xargs menyusun nama-nama itu sebagai argumen untuk grep "ERROR" — hasilnya seluruh file log di-scan untuk kata ERROR tanpa mengetik satu per satu.
Tip
Saat file yang ditemukan find mengandung spasi atau karakter aneh, xargs default akan salah memenggal. Pakai find ... -print0 dan xargs -0 yang menggunakan null sebagai pemisah — aman terhadap semua karakter, termasuk spasi dan newline. Ini menjadi kebiasaan yang menyelamatkan kalian di lingkungan produksi yang tidak terduga.
Sekarang mari kita gabungkan semuanya dalam masalah nyata yang pasti dihadapi setiap admin web: menemukan 10 IP paling sering mengakses situs dari access.log NGINX/Apache.
Format standar combined log format setiap baris dimulai dengan alamat IP, seperti:
203.0.113.7 - - [01/Aug/2026:08:12:01 +0000] "GET / HTTP/1.1" 200 3961 "-" "Mozilla/5.0"
198.51.100.24 - - [01/Aug/2026:08:12:02 +0000] "GET /images/logo.png HTTP/1.1" 200 1024 "-" "Mozilla/5.0"
203.0.113.7 - - [01/Aug/2026:08:12:05 +0000] "GET /about HTTP/1.1" 200 4210 "-" "Mozilla/5.0"
198.51.100.24 - - [01/Aug/2026:08:12:08 +0000] "GET / HTTP/1.1" 200 3961 "-" "Mozilla/5.0"Langkah pertama: ekstrak kolom IP — kolom pertama setiap baris, jadi awk '{print $1}':
awk '{print $1}' access.logLangkah kedua: urutkan agar IP yang sama berdekatan (sort), lalu hitung kemunculan tiap IP (uniq -c):
awk '{print $1}' access.log | sort | uniq -cLangkah ketiga: urutkan dari yang paling sering (sort -rn), lalu ambil 10 teratas (head):
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10 1247 203.0.113.7
982 198.51.100.24
613 192.0.2.15
48 10.0.0.33Hasil ini langsung menjawab pertanyaan "siapa yang paling banyak mengakses server?" — informasi pertama yang dibutuhkan untuk mendeteksi serangan, merencanakan cache, atau sekadar memahami trafik. Perhatikan bagaimana satu pipeline sederhana menyelesaikan analisis yang di Excel butuh beberapa kolom formula.
Important
Urutan pipeline di atas tidak boleh diubah: sort harus datang sebelum uniq (karena uniq hanya menghapus duplikat yang bersebelahan), dan sort -rn untuk frekuensi harus datang setelah uniq -c. Jika sort -rn ditaruh di awal, kalian hanya akan mengurutkan IP secara leksikografis, dan hasil hitungannya kacau. Ingat urutannya: ekstrak → sort → uniq → sort frekuensi → head.
| Kesalahan | Gejala | Solusi |
|---|---|---|
uniq tanpa sort sebelumnya | Duplikat tidak terhapus | Selalu sort | uniq |
egrep yang usang | Tidak ada di semua sistem, dianggap legacy | Gunakan grep -E |
sed -i tanpa melihat hasil dulu | File berubah permanen secara salah | Tes tanpa -i, lalu sed -i.bak |
sort tanpa -n untuk angka | Urutan salah (10 sebelum 9) | Tambahkan -n |
grep case-sensitive pada log | Hasil terlewat karena kapitalisasi | Pakai -i bila perlu |
xargs tanpa -0 pada nama ber-spasi | Argumen terpotong salah | Gunakan -print0 + xargs -0 |
Mencari file baru dengan locate | File tidak ditemukan | Jalankan updatedb atau pakai find |
Pada episode 6 ini, kita telah mengisi toolkit pemrosesan teks yang akan kalian pakai setiap hari: grep untuk menyaring, sort dan uniq untuk mengurutkan dan meringkas, cut dan tr untuk memotong kolom, wc untuk mengukur, sed untuk substitusi streaming, awk untuk pelaporan kolom, serta find, locate, dan xargs untuk menemukan dan mengeksekusi.
Inti yang harus dibawa pulang:
sort | uniq -c | sort -rn adalah cara baku menghitung frekuensi dari kolom mana pun.sed tanpa -i aman, sed -i tanpa backup berbahaya — selalu uji dulu.awk melampaui cut ketika kalian butuh kondisi dan perhitungan.xargs menjembatani output dan argumen — lengkapi dengan -0 untuk keamanan.Sekarang kalian bisa membaca dan mengolah teks dalam skala besar. Di episode 7 selanjutnya, kita akan membahas Symbolic Links, Archiving & Compression — memahami perbedaan hard link dan symlink, membuat dan mengekstrak arsip tar, membandingkan gzip, bzip2, dan xz, hingga membangun rutinitas backup /etc yang aman. Pastikan tetap semangat, karena skill backup ini akan menyelamatkan kalian dari bencana di server produksi!