Xử lý text trên Linux: Đã đến lúc ngừng làm thủ công
Mở một file log 5GB bằng vim chỉ để tìm một dòng lỗi? Hay ngồi sửa tay IP cho 50 file cấu hình? Nếu bạn vẫn đang làm vậy, bạn đang lãng phí thanh xuân rồi. Hồi mới vào nghề, mình từng mất cả buổi chiều để sửa config thủ công. Trong khi đó, một kỹ sư lâu năm chỉ mất 3 giây với một dòng lệnh sed duy nhất.
Trong thế giới Linux, sed và awk là bộ đôi không thể tách rời. sed (Stream Editor) chuyên trị việc tìm và thay thế văn bản. Ngược lại, awk lại cực kỳ hiệu quả trong việc bóc tách dữ liệu theo cột và lập báo cáo. Nắm vững bộ đôi này, bạn sẽ làm chủ hoàn toàn dữ liệu trên server.
Thử ngay: Kết quả tức thì trong 5 phút
Hãy gác lại lý thuyết khô khan. Thử thực hiện hai tác vụ phổ biến nhất dưới đây để thấy sự khác biệt.
1. Thay đổi nội dung file hàng loạt với sed
Giả sử bạn cần đổi localhost thành 127.0.0.1 trong file config.txt:
sed 's/localhost/127.0.0.1/g' config.txt
Lệnh này chỉ in kết quả ra màn hình để bạn kiểm tra. Để ghi đè trực tiếp vào file, hãy thêm flag -i:
sed -i 's/localhost/127.0.0.1/g' config.txt
2. Trích xuất dữ liệu cột với awk
Lấy danh sách username từ file /etc/passwd (các trường phân cách bằng dấu :):
awk -F: '{print $1}' /etc/passwd
Rất gọn gàng. Giờ chúng ta sẽ đi sâu vào cách vận dụng thực tế cho từng công cụ.
Sử dụng sed để chỉnh sửa file không cần mở máy ảo
sed hoạt động theo cơ chế đọc từng dòng, áp dụng quy tắc và xuất kết quả. Cú pháp kinh điển là s/tìm_kiếm/thay_thế/flag.
Mẹo thực chiến với sed
- Dọn dẹp file log: Xóa ngay lập tức các dòng trống để dễ quan sát.
sed -i '/^$/d' system.log - Sửa lỗi file config: Xóa nội dung từ dòng 10 đến 20 nếu cấu hình bị sai.
sed '10,20d' server.conf - Thêm cấu hình mới: Chèn thêm
ServerAliasngay sau dòng có chứaServerName.sed '/ServerName/a \ ServerAlias www.myapp.com' vhost.conf
Lưu ý quan trọng: Đừng bao giờ lạm dụng sed -i khi chưa chắc chắn. Một lỗi typo nhỏ trong Regex có thể phá hỏng toàn bộ file cấu hình Nginx của bạn. Hãy luôn chạy thử không có -i trước. Hoặc an toàn hơn, dùng sed -i.bak để tự động tạo file sao lưu.
Dùng awk để phân tích dữ liệu như một chuyên gia
Nếu sed là thợ sửa chữ, thì awk là một nhà phân tích. Nó coi mỗi dòng là một bản ghi và mỗi từ là một trường dữ liệu.
Các biến cần nhớ trong awk
$1, $2...: Cột 1, cột 2…$NF: Cột cuối cùng (rất hữu ích khi không biết file có bao nhiêu cột).NR: Số thứ tự dòng hiện tại.
Ví dụ nâng cao: Giám sát tài nguyên
Tìm tiến trình ngốn hơn 10% RAM:
ps aux | awk '$4 > 10.0 {print $1, $11, $4}'
Lệnh này lọc danh sách tiến trình, chỉ in ra User, tên Process và %RAM của những thằng đang chạy quá mức cho phép.
Tính tổng dung lượng log trong thư mục:
ls -l | awk '{sum+=$5} END {print "Tổng cộng:", sum/1024/1024, "MB"}'
awk hỗ trợ tính toán toán học và vòng lặp. Nó thực chất là một ngôn ngữ lập trình thu nhỏ trên terminal của bạn.
Tuyệt chiêu phối hợp: Khi awk và sed bắt tay
Sức mạnh thực sự xuất hiện khi bạn kết hợp chúng qua đường ống (pipe |). Một kịch bản thực tế: Tìm 10 IP truy cập vào server nhiều nhất từ file log Nginx và định dạng lại chúng.
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10
Sau khi có danh sách IP này, bạn có thể dùng sed để bọc chúng vào các lệnh chặn của iptables. Mọi thứ diễn ra hoàn toàn tự động.
Mẹo nhỏ giúp câu lệnh sạch sẽ hơn
1. Thay đổi dấu phân cách trong sed
Khi sửa đường dẫn (path), dấu gạch chéo / thường gây rối vì phải dùng escape \/. Hãy thay bằng dấu | hoặc : cho dễ nhìn:
# Khó đọc: sed 's/\/var\/www\/html/\/data\/www/g'
# Dễ đọc: sed 's|/var/www/html|/data/www|g'
2. Lấy cột cuối cùng nhanh gọn
Không cần đếm cột, $NF sẽ luôn trả về giá trị cuối cùng của dòng. Điều này cực kỳ hữu dụng khi xử lý các file log có độ dài dòng không cố định.
Lời kết
Thành thạo awk và sed không giúp bạn giỏi hơn sau một đêm. Tuy nhiên, nó giúp bạn làm việc nhàn nhã và chính xác hơn. Thay vì hì hục làm tay, hãy dành vài phút viết một dòng lệnh. Khi đã quen tay, bạn sẽ thấy terminal là một công cụ cực kỳ quyền năng. Chúc anh em áp dụng thành công vào hệ thống của mình!
