- File log trên server thường bị gzip để tiết kiệm disk.
- Đừng gunzip mỗi lần cần tra cứu — bộ zcat, zless, zgrep, zdiff có sẵn từ 1992 cho phép đọc và search trực tiếp trên file .gz, zero disk overhead.
TL;DR
Log rotate trên Linux gần như luôn gzip (syslog.2.gz, nginx/access.log.1.gz). Không cần gunzip ra file tạm rồi grep rồi rm. Package gzip đi kèm bộ wrapper tên bắt đầu bằng z — zcat, zless, zgrep, zegrep, zfgrep, zcmp, zdiff — cho phép đọc và search .gz trực tiếp. Decompress on-the-fly qua pipe, không ghi disk. Cài sẵn trên mọi distro >30 năm nay. Cực kỳ hợp để triage log lúc 3AM.
Z-tools là gì
Đây không phải thứ mới — nhưng vẫn rất nhiều developer không biết. Đợt tip gần đây của @sysxplore nhắc lại và khơi lại discussion trên X.
Về bản chất, z-tools là shell script wrappers quanh các lệnh Linux quen thuộc. Bạn xem source sẽ bất ngờ: cat $(which zgrep) chỉ trả về chưa tới 100 dòng bash. Chúng làm đúng một việc: mở file .gz, decompress qua stdin, chạy lệnh gốc (grep, less, diff…) trên stream đó, rồi in kết quả.
Toàn bộ bộ này ship kèm package gzip. Ubuntu, Debian, Fedora, Arch, Alpine, Amazon Linux — có gzip là có z-tools.
Lệnh nào làm gì
| Lệnh | Tương đương | Dùng để |
|---|---|---|
zcat | cat (= gunzip -c) | In nội dung file .gz ra stdout |
zless | less | Pager có scroll, search /pattern |
zmore | more | Pager đơn giản hơn zless |
zgrep | grep | Search pattern (basic regex) |
zegrep | grep -E | Search extended regex |
zfgrep | grep -F | Search fixed string (nhanh hơn, không regex) |
zdiff | diff | So sánh 2 file (nội dung khác chỗ nào) |
zcmp | cmp | So sánh 2 file (báo khác byte đầu tiên) |
Ngoài ra còn znew (convert .Z cũ sang .gz) và zforce (gắn lại đuôi .gz cho gzipped file bị mất extension) — ít dùng hơn trong đời sysadmin hiện đại.
Cheat sheet
# Xem toàn bộ file .gz
zcat /var/log/syslog.2.gz
# Pager có scroll + search
zless /var/log/nginx/access.log.1.gz
# Grep 1 file, case-insensitive
zgrep -i "error" /var/log/syslog.2.gz
# Grep nhiều file cùng lúc (log rotate 30 ngày)
zgrep -i "out of memory" /var/log/syslog*.gz
# Đếm 5xx trong log nginx rotate
zgrep -c " 5[0-9][0-9] " /var/log/nginx/access.log.*.gz
# Extended regex: match IP pattern
zegrep "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log.gz
# Fixed string (nhanh nhất khi không cần regex)
zfgrep "Failed password" /var/log/auth.log*.gz
# So 2 file log rotate để thấy diff
zdiff /var/log/auth.log.1.gz /var/log/auth.log.2.gz
Mọi flag của grep đều pass through: -n (số dòng), -A 3 -B 3 (context), -v (invert), -l (chỉ in tên file match), -c (count)… vì man page nói thẳng: “All options specified are passed directly to grep.”
Use case thực tế
Incident 3AM. Server OOM, cần trace xem process nào RSS tăng vọt lúc nào. Log đã rotate qua 2 ngày, file hiện tại là syslog, còn lại là syslog.1, syslog.2.gz, syslog.3.gz…
zgrep -i "killed process" /var/log/syslog*.gz /var/log/syslog{,.1}Một lệnh, quét xuyên suốt. Không tạo file tạm, không lo /var đầy.
Security audit. Đếm SSH brute-force attempts trong 30 ngày:
zgrep "Failed password" /var/log/auth.log*.gz | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | headWeb log triage. Đâu là path trả 5xx nhiều nhất tuần qua?
zgrep " 5[0-9][0-9] " /var/log/nginx/access.log.*.gz | awk '{print $7}' | sort | uniq -c | sort -rn | headConfig drift sau upgrade. Package manager giữ bản cũ dưới dạng .dpkg-dist, đôi khi bị gzip:
zdiff /etc/foo.conf.gz /etc/foo.conf.dpkg-dist.gzCI/CD artifact. Jenkins/GitLab thường nén log build. zless build.log.gz mở xem ngay, không download-unzip.
Limitations & lưu ý
- Chỉ gzip. Không hoạt động với
.bz2,.xz,.zst,.zip. Dùng song song vớibzgrep/xzgrep/zstdgreptương ứng. - Tar archive khác gzip file.
.tar.gzlà tar chứa nhiều entry — z-tools không hiểu layout. Dùngtar -zxOf archive.tar.gz path/inside | grep .... - Decompress toàn stream. Dù chỉ
zgrep1 từ, gzip vẫn phải decompress hết file. Với log vài GB thì tốn CPU. Không có random access như Parquet hay seekable zstd. - Đọc-only. Muốn edit compressed file vẫn phải
gunzip→ edit →gzip. - Nhiều file:
zcat a.gz b.gzsẽ concat nội dung — cẩn thận khiwc -l. - Hiệu năng batch:
zgrepspawn sub-shell cho mỗi file. Grep hàng nghìn file.gzsẽ chậm đáng kể so với grep trên cùng dữ liệu đã uncompress. Với log cực lớn, cân nhắc pipeline song song (parallel zgrep ...).
Takeaway
Ba mươi năm rồi z-tools vẫn là tool đầu tiên mọi sysadmin nên reach-for khi đụng file .gz. Nhẹ, preinstalled, không dependency, pipe-friendly. Lần tới trước khi gõ gunzip -k, hãy thử z + tên lệnh quen thuộc — 90% cơ hội nó đã có sẵn.
Nguồn: @sysxplore, zgrep(1) man page, It's FOSS, The Geek Stuff.

