Ba công cụ xử lý văn bản mạnh mẽ trong Linux: grep, sed và awk

Trong hệ thống Linux/Unix, ba công cụ dòng lệnh grep, sedawk đóng vai trò then chốt trong việc xử lý dữ liệu văn bản — từ tìm kiếm nhanh, chỉnh sửa hàng loạt đến phân tích cấu trúc phức tạp. Mỗi công cụ có phạm vi chuyên biệt, nhưng khi kết hợp, chúng tạo thành một bộ giải pháp toàn diện cho tự động hóa vận hành và xử lý log.

1. Phân biệt chức năng cốt lõi

  • grep: Công cụ lọc dựa trên biểu thức chính quy. Chỉ thực hiện tìm kiếmlọc dòng — phù hợp để xác định nhanh các mẫu như mã lỗi, tên người dùng hoặc địa chỉ IP trong tập tin lớn.
  • sed: Trình biên tập luồng (stream editor). Thực hiện thao tác thay thế, xóa, chèn hoặc thêm nội dung trực tiếp trên luồng dữ liệu — không cần mở file, rất hiệu quả với tác vụ chỉnh sửa cấu hình hàng loạt.
  • awk: Ngôn ngữ xử lý văn bản có khả năng lập trình. Tập trung vào xử lý theo cột, hỗ trợ tính toán, thống kê, điều kiện phức tạp và cấu trúc dữ liệu (như mảng liên kết) — lý tưởng cho phân tích log dạng CSV, báo cáo hiệu suất hoặc trích xuất trường có điều kiện.

2. Các ví dụ minh họa tối ưu hóa

2.1. grep — Lọc thông minh với tùy chọn nâng cao

Tạo tệp mẫu:

cat > logs.txt <<'EOF'
[INFO] User alice logged in at 2024-05-10T08:22:15
[WARN] Disk usage exceeds 85% on /dev/sda1
[ERROR] Connection timeout to api.example.com
[INFO] User bob accessed /admin/dashboard
[CRITICAL] Failed to start service nginx
EOF

Một số thao tác phổ biến:

  • Lọc tất cả cảnh báo mức ERROR hoặc CRITICAL, bỏ qua phân biệt hoa thường:
    grep -iE "(error|critical)" logs.txt
  • Hiển thị số thứ tự dòng và chỉ in phần sau dấu hai chấm:
    grep -n "timeout" logs.txt | sed -r 's/^[^:]+:[[:space:]]*//'
  • Đếm số lần xuất hiện của mỗi mức độ nhật ký:
    awk '{print $2}' logs.txt | sort | uniq -c | sort -nr

2.2. sed — Chỉnh sửa không lưu trữ tạm

Sử dụng tệp config.ini:

cat > config.ini <<'EOF'
host = localhost
port = 8080
debug = false
timeout = 30
EOF

Các lệnh thực tế:

  • Thay đổi giá trị port thành 8000, ghi đè lên tệp gốc:
    sed -i 's/^port[[:space:]]*=[[:space:]]*[0-9]\+$/port = 8000/' config.ini
  • Vô hiệu hóa debug bằng cách thêm dấu # vào đầu dòng:
    sed -i '/^debug[[:space:]]*=/ s/^/#/' config.ini
  • Chèn một cấu hình mới sau dòng chứa host:
    sed -i '/^host[[:space:]]*=/ a\protocol = https' config.ini

2.3. awk — Xử lý cột và phân tích dữ liệu

Xử lý danh sách người dùng từ /etc/passwd với logic điều kiện:

# Hiển thị UID và shell của người dùng có UID >= 1000, sắp xếp theo UID giảm dần
awk -F: '$3 >= 1000 { print $3, $7 }' /etc/passwd | sort -k1,1nr

Phân tích log truy cập web (dạng: IP - - [timestamp] "METHOD PATH PROTO" CODE SIZE):

# Đếm top 5 địa chỉ IP có số request nhiều nhất
awk '{ip[$1]++} END {for (addr in ip) print ip[addr], addr}' access.log | \
  sort -nr | head -5 | awk '{print $2 "\t" $1}'

Trích xuất địa chỉ IPv4 từ output của ip addr:

ip addr show eth0 | \
  awk -F'[[:space:]/]+' '/inet[[:space:]]+[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ {print $3; exit}'

3. Nguyên tắc thiết kế và hiệu năng

  • grepsed xử lý dữ liệu theo dòng — bộ nhớ sử dụng cố định, thời gian thực thi tuyến tính với kích thước tệp. Không gây tràn bộ nhớ ngay cả với tệp vài GB.
  • awk cũng xử lý từng dòng, nhưng hỗ trợ lưu trữ trạng thái (biến, mảng) giữa các dòng — cho phép tính toán tích lũy như tổng, đếm, hoặc nhóm dữ liệu.
  • Tất cả đều hoạt động tốt với luồng chuẩn (|), giúp xây dựng pipeline mạnh mẽ mà không cần tệp trung gian.

4. Khi nào nên dùng công cụ nào?

Nhiệm vụ Công cụ đề xuất Lý do
Tìm dòng chứa "Failed login" trong file auth.log grep "Failed login" auth.log Tốc độ cao, cú pháp đơn giản, không cần xử lý thêm
Thay đổi tất cả đường dẫn /var/log thành /opt/logs trong 50 tệp cấu hình sed -i 's#/var/log#/opt/logs#g' *.conf Hỗ trợ regex linh hoạt, thay thế hàng loạt, không tương tác
Tính tổng dung lượng disk từ output của df -h, loại bỏ tiêu đề và cột % df -h | awk 'NR>1 {sum += $3} END {print "Total used: " sum "G"}' Cần trích xuất cột cụ thể, tính toán và xử lý điều kiện dòng đầu

Thẻ: grep sed awk linux shell-scripting

Đăng vào ngày 22 tháng 8 lúc 11:28