jvinhit//lab

Search posts

Type to search across journal entries.

navigate open esc close

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ímTác dụng
Spacexuống một trang
blên một trang
/texttìm text
nmatch tiếp theo
qthoá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: dudf

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

  1. Chạy build/test của project, lưu output vào build.log bằng tee.
  2. Dùng tail xem 30 dòng cuối của build.log.
  3. Dùng wc -l đếm số dòng log.
  4. Dùng du tì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, difftee 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.