Recraftory

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 | uniq

grep

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.log

sed (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.txt

Operasi 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 sed

awk

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 terakhir

Dengan Delimiter

# CSV dengan delimiter koma
awk -F',' '{print $2}' data.csv

# /etc/passwd dengan delimiter colon
awk -F':' '{print $1, $6}' /etc/passwd

Condition 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.txt

cut

# 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 3

sort 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 duplikat

Contoh: 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 -10

Contoh: 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.csv

xargs

# 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 rm

find

# 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 -E untuk regex kompleks
  • Pipeline umum: grepsed/awksort
  • Untuk file besar, hindari multiple pipe jika memungkinkan
  • awk lebih powerful dari sed untuk data terstruktur
  • Gunakan xargs -0 atau -print0 untuk filename dengan spasi