Text processing trong Bash cho DevOps
Ở bài trước chúng ta đã xử lý file: đọc, ghi, redirect, tee, find và xargs. Nhưng file text chỉ thật sự hữu ích khi bạn biết lọc, trích xuất và biến đổi dữ liệu trong đó.
Trong DevOps, grep, awk và sed xuất hiện ở khắp nơi: lọc log lỗi, lấy status code từ access log, đếm IP truy cập nhiều nhất, thay đổi config trước khi deploy, hoặc tạo report nhanh từ output của command. Bài này đi qua ba công cụ theo hướng thực dụng, có ví dụ gần với vận hành hằng ngày.
grep: tìm dòng khớp pattern
grep đọc input và in ra những dòng khớp pattern. Đây thường là bước đầu tiên khi bạn cần tìm nhanh thông tin trong log hoặc config.
| |
Một số option hay dùng:
| |
Theo GNU grep, -E dùng extended regular expression, còn -F dùng fixed strings. Khi pattern là chuỗi literal đơn giản, grep -F giúp tránh lỗi do ký tự như ., [, * bị hiểu là regex.
grep context: xem dòng trước và sau lỗi
Khi debug log, chỉ một dòng lỗi thường chưa đủ. GNU grep hỗ trợ context:
| |
Ví dụ xem lỗi deploy kèm ngữ cảnh:
| |
Khi có nhiều nhóm match cách xa nhau, grep mặc định chèn dòng -- để phân tách context group. Điều này hữu ích khi đọc terminal, nhưng nếu output đưa vào script khác, bạn nên nhớ dòng separator này có thể xuất hiện.
grep trong pipeline DevOps
Ví dụ lọc log ứng dụng, bỏ healthcheck và chỉ xem lỗi nghiêm trọng:
| |
Vì grep trả exit code 1 khi không có match, pipeline có thể làm script dừng nếu đang dùng set -e. Trong tình huống “không có lỗi” là bình thường, thêm || true ở cuối pipeline là chấp nhận được. Với pipeline quan trọng hơn, hãy xử lý exit code rõ ràng bằng if grep ...; then ... fi.
awk: xử lý theo dòng và theo cột
awk đọc input theo record, mặc định mỗi dòng là một record. Mỗi dòng được tách thành field: $1, $2, $3… Toàn bộ dòng là $0.
| |
Một số biến built-in quan trọng:
NR: số record đã đọc từ đầu input.NF: số field của record hiện tại.$0: toàn bộ dòng hiện tại.$1,$2, …: field thứ nhất, thứ hai, …FS: field separator input.OFS: output field separator.
Ví dụ in số dòng và số field:
| |
Theo GNU awk manual, NR tăng mỗi khi awk đọc record mới, còn NF là số field của record hiện tại. Đây là hai biến rất hữu ích khi cần validate dữ liệu text nhanh.
awk BEGIN, END và điều kiện
BEGIN chạy trước khi đọc input. END chạy sau khi đọc hết input. Phần giữa là rule áp dụng cho từng dòng.
| |
Ví dụ dễ đọc hơn, đếm HTTP status code từ Nginx access log dạng phổ biến:
| |
Trong access log phổ biến, $1 thường là IP client, $7 là path và $9 là HTTP status. Tuy nhiên format log có thể khác theo cấu hình Nginx/Apache, nên hãy kiểm tra vài dòng mẫu trước khi hardcode vị trí field.
awk với delimiter tùy chỉnh
Mặc định awk tách field theo whitespace. Với file dạng key-value hoặc CSV đơn giản, dùng -F để chọn delimiter.
| |
Ví dụ đọc file .env và bỏ comment/dòng rỗng:
| |
Với CSV phức tạp có quote, comma bên trong field hoặc escape, awk -F, không đủ an toàn. Khi đó nên dùng parser CSV đúng nghĩa bằng Python, Go hoặc công cụ chuyên dụng.
sed: thay thế và chỉnh text theo dòng
sed là stream editor: đọc input, áp dụng script, rồi ghi output. Lệnh nổi tiếng nhất là substitute:
| |
Theo GNU sed manual, cú pháp cơ bản là s/regexp/replacement/flags. Flag g thay tất cả match trong dòng thay vì chỉ match đầu tiên.
Ví dụ đổi endpoint trong file config và ghi ra file mới:
| |
Ở đây dùng delimiter | thay vì / để tránh phải escape nhiều dấu / trong URL.
sed theo address và in-place edit
Bạn có thể giới hạn sed chỉ tác động trên dòng khớp pattern hoặc range.
| |
GNU sed hỗ trợ -i để chỉnh file tại chỗ. Nếu truyền suffix, sed tạo backup trước khi rename file tạm thành file gốc:
| |
Cẩn thận với sed -i:
- Luôn test không
-itrước để xem output. - Dùng suffix như
.bakkhi chỉnh file quan trọng. - Khác biệt cú pháp
sed -igiữa GNU sed và BSD/macOS sed có thể làm script kém portable.
Thực hành DevOps: parse Nginx log
Giả sử access log có format phổ biến:
| |
Lọc lỗi 4xx/5xx bằng awk:
| |
Đếm top IP truy cập nhiều nhất:
| |
Đếm status code:
| |
Nếu bạn muốn bỏ các request healthcheck khỏi thống kê:
| |
Thực hành DevOps: đổi config trước khi deploy
Ví dụ script cập nhật LOG_LEVEL và FEATURE_FLAG trong file .env, có backup trước khi sửa.
| |
Script này minh họa cách phối hợp công cụ:
cptạo backup rõ ràng trước khi chỉnh.sedthay giá trị nếu key đã tồn tại.grep -qkiểm tra key có tồn tại chưa.>>append key còn thiếu.
Lưu ý: không đưa secret thật vào ví dụ hoặc commit. Với secret, ưu tiên biến môi trường, secret manager hoặc CI/CD secret store.
Thực hành DevOps: report lỗi từ log
Ví dụ tạo report ngắn gồm tổng số lỗi và top endpoint trả 5xx:
| |
Đây là dạng script rất hữu ích để chạy từ cron hoặc CI job sau test load, miễn là bạn hiểu rõ format log đầu vào.
Sai sót thường gặp
- Dùng regex khi chỉ cần literal: Nếu pattern có ký tự đặc biệt như
[,.,*, cân nhắcgrep -F. - Quên grep exit code: Không có match là exit code
1, không nhất thiết là lỗi nghiệp vụ. - Hardcode field log mà không kiểm tra format:
$9là status code với format phổ biến, nhưng không phải mọi log đều như vậy. - Dùng
awk -F,cho CSV phức tạp: CSV có quote/comma bên trong field cần parser đúng nghĩa. - Chạy
sed -ingay trên file quan trọng: Test output trước, dùng backup suffix hoặc copy file trước khi sửa. - Không quote biến trong script: Khi truyền file path vào
grep,awk,sed, luôn quote"${FILE}".
Ghi chú triển khai
- Khi áp dụng vào dự án của bạn, chọn công cụ theo mục tiêu:
- Tìm/lọc dòng →
grep. - Trích cột, tính tổng, đếm nhóm →
awk. - Thay thế text theo dòng/pattern →
sed.
- Tìm/lọc dòng →
- Best practices:
- Dùng
grep -nkhi debug để biết line number. - Dùng
grep -Ckhi cần context quanh lỗi. - Dùng
awkvớiBEGIN/ENDđể tạo report có header/footer. - Dùng delimiter khác trong
sedkhi xử lý URL/path, ví dụs|old|new|g. - Với chỉnh sửa config, backup trước và verify sau bằng
grephoặc test config của service.
- Dùng
- Troubleshooting:
- Pipeline dừng vì
grepkhông match? → Xử lý exit code bằngif grep ...hoặc|| truekhi hợp lý. awkin sai cột? → In thửawk '{ print NR, NF, $0 }'để kiểm tra field.sedkhông thay gì? → Kiểm tra pattern có anchor đúng không, delimiter có cần escape không.
- Pipeline dừng vì
🎯 Lời kết
grep, awk và sed là bộ ba nền tảng để biến Bash thành công cụ xử lý log/config cực nhanh. grep giúp tìm đúng dòng, awk giúp phân tích theo cột và tổng hợp số liệu, còn sed giúp chỉnh sửa text có kiểm soát. Khi kết hợp với kỹ năng xử lý file ở bài trước, bạn đã có thể tạo nhiều script DevOps nhỏ nhưng rất hữu ích.
Ở bài tiếp theo, chúng ta sẽ đi vào function trong Bash: tách logic thành hàm, truyền tham số, dùng local, xử lý return code và xây dựng thư viện logging nhỏ để tái sử dụng. 🚀
Tài liệu tham khảo
- GNU Grep Manual — Tài liệu chính thức về
grep, regex,-E,-F,-n,-A,-B,-C. - GNU Awk Manual — Tài liệu chính thức về field,
NR,NF,BEGIN,ENDvà awk program. - GNU Sed Manual — Tài liệu chính thức về
s/regexp/replacement/flags, address và-i. - GNU Coreutils Manual — sort — Tham khảo thêm cho các pipeline thống kê với
sort.
