Command Line cho Developer · Part 2 - Inspect Files, Logs & Output
Các lệnh đọc file và log hằng ngày: cat, less, head, tail -f, wc, file, du, df, sort, uniq, cut, diff và cách inspect output không mở editor.
Đây là Phần 2 của series Command Line cho Developer. Phần trước đặt nền: terminal, path, file và navigation. Giờ ta học nhóm lệnh để nhìn vào dữ liệu: đọc file, xem log, đếm dòng, đo dung lượng, so sánh output.
Một developer dùng terminal tốt không phải vì gõ nhanh hơn người khác. Họ giỏi vì biết nhìn đúng chỗ, lọc đúng dòng, và giữ output đủ nhỏ để não xử lý.
cat, less, head, tail
Đọc file nhỏ:
cat package.json
cat .env.example
Đọc file dài:
less src/content/posts/dev-cli-01-terminal-files-navigation.mdx
Trong less:
| Phím | Tác dụng |
|---|---|
Space | xuống một trang |
b | lên một trang |
/text | tìm text |
n | match tiếp theo |
q | thoát |
Xem đầu/cuối file:
head -20 app.log
tail -40 app.log
Theo dõi log realtime:
tail -f app.log
tail -n 100 -f app.log
Khi server local đang chạy, tail -f giúp bạn vừa thao tác trên UI vừa nhìn log đổi ngay.
Đếm dòng, từ, byte với wc
wc README.md
wc -l README.md # số dòng
wc -c README.md # số byte
wc -w README.md # số từ
Đếm số file TypeScript:
find src -name '*.ts' -o -name '*.tsx' | wc -l
Đếm số dòng log lỗi:
grep -i "error" app.log | wc -l
Đây là pattern chung: command tạo output, pipe qua wc -l để biến output thành con số.
Nhận diện file với file
Khi file không mở được hoặc extension kỳ lạ:
file image.png
file archive.tar.gz
file ./bin/tool
Ví dụ output:
image.png: PNG image data, 1200 x 630, 8-bit/color RGBA
tool: Mach-O 64-bit executable arm64
Lệnh này hữu ích khi upload file bị lỗi, binary không chạy, hoặc bạn nghi file text đang dùng encoding/dòng kết thúc khác thường.
Dung lượng: du và df
Xem dung lượng thư mục:
du -sh node_modules
du -sh dist coverage .astro
Xem thư mục nào nặng:
du -h -d 1 . | sort -h
Trên Linux, option thường là --max-depth=1; trên macOS/BSD là -d 1.
Xem dung lượng ổ đĩa:
df -h
Nếu build đột nhiên fail vì “no space left on device”, chạy df -h trước, rồi du -h -d 1 . | sort -h.
sort, uniq, cut: xử lý text nhỏ
Tìm tag lặp trong một danh sách:
sort tags.txt | uniq -c | sort -nr
Tách cột bằng delimiter:
cut -d',' -f1 users.csv
cut -d':' -f1 /etc/passwd
Top error message trong log đơn giản:
grep "ERROR" app.log | cut -d' ' -f5- | sort | uniq -c | sort -nr | head
Ý tưởng không phải viết data pipeline phức tạp bằng shell. Ý tưởng là đủ nhanh để trả lời câu hỏi nhỏ: dòng nào nhiều nhất, status nào nhiều nhất, file nào nặng nhất.
So sánh file với diff
diff old.json new.json
diff -u old.json new.json
-u tạo unified diff, dễ đọc và giống format Git.
So sánh output của hai command:
diff -u <(npm run routes) <(npm run routes:new)
<(...) là process substitution của bash/zsh: shell chạy command và đưa output như một file tạm.
tee: vừa xem vừa lưu
npm run build 2>&1 | tee build.log
tee copy stream ra màn hình và ghi vào file. Khi bug chỉ xảy ra trong CI hoặc build dài, lưu log lại giúp bạn search và gửi cho đồng đội.
Ghi tiếp vào file:
npm run test 2>&1 | tee -a test.log
Recipe nhanh
Xem 80 dòng cuối log và follow tiếp:
tail -n 80 -f app.log
Tìm file lớn trong project:
find . -type f -size +5M -print
Xem 20 thư mục/file nặng nhất ở cấp hiện tại:
du -h -d 1 . | sort -h | tail -20
Lưu build log để debug sau:
npm run build 2>&1 | tee build.log
Đếm số dòng TODO trong source:
grep -R "TODO" src | wc -l
Ở phần sau ta sẽ thay grep -R bằng rg, nhanh và thân thiện với codebase hơn.
Bài tập
- Chạy build/test của project, lưu output vào
build.logbằngtee. - Dùng
tailxem 30 dòng cuối củabuild.log. - Dùng
wc -lđếm số dòng log. - Dùng
dutìm thư mục nặng nhất trong repo hiện tại.
Lời giải tham khảo
npm run build 2>&1 | tee build.log
tail -30 build.log
wc -l build.log
du -h -d 1 . | sort -h | tailĐiều cốt lõi
Biết đọc output là nền của mọi debugging. less, tail -f, wc, du, sort, uniq, diff và tee giúp bạn trả lời nhanh: file có gì, log đang nói gì, dữ liệu lớn cỡ nào, và hai phiên bản khác nhau ở đâu.