Text Processing
Manipulasi teks dengan tool Unix classico grep, sed, awk, cut
Pipeline
# Output satu command menjadi input command berikutnya
cat file.txt | grep "error" | wc -l
cat file.txt | sort | uniqgrep
Pattern Matching
grep "pattern" file.txt # Cari pattern di file
grep -i "pattern" file.txt # Case insensitive
grep -v "pattern" file.txt # Invert match (baris yang TIDAK cocok)
grep -n "pattern" file.txt # Tampilkan nomor baris
grep -r "pattern" dir/ # Recursive (cari di semua file)
grep -E "pattern1|pattern2" # Extended regex (atau)Contoh
# Cari log error
grep -i "error" /var/log/app.log
# Cari file yang mengandung TODO
grep -r "TODO" ./src/
# Cari IP address di log
grep -oE '\b[0-9]{1,3}(\.[0-9]{1,3}){3}\b' access.logsed (Stream Editor)
Substitusi
# Replace pertama per baris
sed 's/foo/bar/' file.txt
# Replace semua per baris
sed 's/foo/bar/g' file.txt
# Replace ke-2 per baris
sed 's/foo/bar/2' file.txt
# Replace dari ke-2 sampai akhir
sed 's/foo/bar/2g' file.txtOperasi File
# Hapus baris 1-5
sed '1,5d' file.txt
# Hapus baris yang mengandung pattern
sed '/pattern/d' file.txt
# Print baris 10-20
sed -n '10,20p' file.txt
# In-place edit (langsung ubah file)
sed -i 's/foo/bar/g' file.txt # GNU sed
sed -i '' 's/foo/bar/g' file.txt # macOS sedawk
Dasar
# Print kolom tertentu (default delimiter: space/tab)
awk '{print $1}' file.txt # Kolom pertama
awk '{print $1, $3}' file.txt # Kolom 1 dan 3
awk '{print $NF}' file.txt # Kolom terakhirDengan Delimiter
# CSV dengan delimiter koma
awk -F',' '{print $2}' data.csv
# /etc/passwd dengan delimiter colon
awk -F':' '{print $1, $6}' /etc/passwdCondition dan Action
# Filter dan print
awk '$3 > 100 {print $1, $3}' data.txt
# Dengan BEGIN/END
awk 'BEGIN {sum=0} {sum+=$3} END {print "Total:", sum}' data.txt
# Multi condition
awk '$2 == "ERROR" && $4 > 10 {print $0}' log.txtcut
# Extract karakter
cut -c 1-10 file.txt # Karakter 1-10
cut -c 5- file.txt # Karakter 5 sampai akhir
# Extract field (delimiter)
cut -d':' -f1 /etc/passwd # Field 1, delimiter colon
cut -d',' -f1,3 data.csv # Field 1 dan 3sort dan uniq
# Sort
sort file.txt # Ascending
sort -r file.txt # Descending
sort -n file.txt # Numerik
sort -k2 file.txt # Sort berdasarkan kolom 2
# Uniq (hanya berfungsi jika data sudah sorted)
sort file.txt | uniq
sort file.txt | uniq -c # Hitung frekuensi
sort file.txt | uniq -d # Hanya tampilkan duplikatContoh: Parse Log Nginx
#!/bin/bash
LOG_FILE="/var/log/nginx/access.log"
# Top 10 IP address yang paling banyak request
echo "Top 10 IP Address:"
awk '{print $1}' "$LOG_FILE" | sort | uniq -c | sort -rn | head -10
# Status code yang paling sering
echo -e "\nStatus Code:"
awk '"'"'{print $9}'"'"' "$LOG_FILE" | sort | uniq -c | sort -rn
# Request yang paling banyak (path)
echo -e "\nTop Request Path:"
awk '{print $7}' "$LOG_FILE" | sort | uniq -c | sort -rn | head -10Contoh: CSV Processing
#!/bin/bash
# Header
head -1 data.csv
# Filter row berdasarkan kolom
awk -F',' '$3 > 1000 {print $1, $2}' data.csv
# Extract dan transform
awk -F',' 'NR>1 {print "INSERT INTO users (name, email) VALUES ('"'"'" $1 "'"'"', '"'"'" $2 "'"'"');"}' data.csvxargs
# Jalankan command untuk setiap baris input
find . -name "*.log" | xargs rm
# Dengan delimiter null (aman untuk filename dengan spasi)
find . -name "*.log" -print0 | xargs -0 rm
# Parallel execution
find . -name "*.jpg" | xargs -P4 -I{} convert {} {}.png
# Dengan confirmation
find . -name "*.tmp" | xargs -p rmfind
# Cari file berdasarkan nama
find . -name "*.txt"
find . -iname "*.txt" # Case insensitive
# Cari berdasarkan tipe
find . -type f # File
find . -type d # Direktori
# Cari berdasarkan waktu
find . -mtime -7 # Dimodifikasi dalam 7 hari terakhir
find . -atime +30 # Diakses lebih dari 30 hari lalu
# Jalankan action
find . -name "*.tmp" -delete
find . -name "*.log" -exec rm {} \;
find . -name "*.txt" -exec cat {} \; | grep "error"Best Practice
- Gunakan
grep -Euntuk regex kompleks - Pipeline umum:
grep→sed/awk→sort - Untuk file besar, hindari multiple pipe jika memungkinkan
awklebih powerful dariseduntuk data terstruktur- Gunakan
xargs -0atau-print0untuk filename dengan spasi