Câu 1uniq coi những dòng nào là trùng lặp?
Công cụ định dạng văn bản — sort / uniq / cut / wc / tr / tee
Thực hành sắp xếp với sort -n, đếm trùng lặp với sort | uniq -c, trích cột với cut -d',' -f1, đếm dòng với wc -l, chuyển ký tự với tr 'a-z' 'A-Z' và tách đầu ra với tee, từng lệnh một với sơ đồ và terminal.
Sắp xếp các dòng — sort
Trong bài này, bạn sẽ thực hành sáu lệnh định dạng văn bản, từng lệnh một: sort / uniq / cut / wc / tr / tee. Đầu tiên là sort. Lệnh này sắp xếp lại các dòng đầu vào theo thứ tự từ điển (so sánh từng ký tự). Dùng sort -n để sắp xếp các dòng theo giá trị số, và sort -r để xếp giảm dần. Theo thứ tự từ điển, 10 đứng trước 2 (vì so sánh ký tự đầu 1 và 2), nên sắp xếp số cần -n.
| Cú pháp | Ý nghĩa |
|---|---|
sort | Sắp xếp các dòng theo thứ tự từ điển |
sort -n | Sắp xếp các dòng theo giá trị số |
sort -r | Đảo ngược thứ tự (giảm dần) |
10 đứng trước 2. Thêm -n để xếp theo số.printf 'cherry\napple\nbanana\n' > words.txt # tạo tệp 3 dòng
sort words.txt # apple banana cherry (thứ tự từ điển)
sort -r words.txt # cherry banana apple (giảm dần)
printf '100\n9\n25\n' > scores.txt # tạo tệp dữ liệu số
sort scores.txt # 100 25 9 (thứ tự từ điển đưa 1 lên đầu)
sort -n scores.txt # 9 25 100 (thứ tự số)
Gộp các dòng trùng lặp — uniq
uniq gộp các dòng giống nhau đứng liền kề thành một. Nó không bao giờ nhìn thấy các dòng trùng ở xa nhau, nên thường bạn chạy sort trước để đưa các dòng bằng nhau về cạnh nhau rồi chuyển kết quả qua pipe. Thêm uniq -c thì mỗi dòng được gắn số lần xuất hiện ở đầu — một bảng đếm theo loại ngay tức thì.
| Cú pháp | Ý nghĩa |
|---|---|
uniq | Gộp các dòng giống nhau liền kề thành một |
sort file.txt | uniq | Sắp xếp trước để gộp cả các dòng trùng ở xa nhau |
uniq -c | Gắn số lần xuất hiện vào đầu mỗi dòng |
uniq chỉ thấy các dòng trùng liền kề, nên chạy sort trước để đưa các dòng bằng nhau về cạnh nhau.printf 'banana\napple\nbanana\napple\n' > items.txt # tạo tệp 4 dòng
sort items.txt # apple apple banana banana
sort items.txt | uniq # apple banana (đã loại trùng lặp)
sort items.txt | uniq -c # 2 apple / 2 banana (số lần xuất hiện)
Trích xuất cột — cut
cut tách mỗi dòng theo ký tự phân cách và chỉ giữ lại các trường bạn yêu cầu. Ký tự phân cách đặt sau -d, số thứ tự trường đặt sau -f, nên cut -d',' -f1 lấy ra cột đầu tiên của tệp CSV. Với nhiều trường, liệt kê bằng dấu phẩy như -f1,3. Đây là công cụ để lấy đúng các cột cần thiết từ CSV hoặc tệp cấu hình phân cách bằng dấu hai chấm.
| Cú pháp | Ý nghĩa |
|---|---|
cut -d',' -f1 | Trích trường 1 của các dòng phân cách bằng dấu phẩy |
cut -d':' -f1 | Trích trường 1 của các dòng phân cách bằng : |
cut -d',' -f1,3 | Trích trường 1 và 3 cùng lúc |
-d, và chỉ các trường đánh số trong -f được in ra.printf 'root:x:0\nuser:x:1000\n' > passwd.txt # tạo tệp phân cách bằng dấu hai chấm
cut -d':' -f1 passwd.txt # chỉ trường 1 (tên)
cut -d':' -f1,3 passwd.txt # trường 1 và 3
Đếm dòng, từ và byte — wc
wc đếm số dòng, số từ và số byte của đầu vào. Không có tùy chọn thì nó in cả ba con số; wc -l chỉ in số dòng, wc -w chỉ in số từ, và wc -c chỉ in số byte. Lệnh bạn dùng nhiều nhất là wc -l — nhận từ pipe, như ls | wc -l, nó trả lời các câu hỏi kiểu "có bao nhiêu tệp?" hay "bao nhiêu dòng khớp?".
| Cú pháp | Ý nghĩa |
|---|---|
wc | In số dòng, số từ và số byte cùng lúc |
wc -l | Chỉ in số dòng |
wc -w | Chỉ in số từ |
wc -c | Chỉ in số byte |
printf 'one two three\nfour\n' > draft.txt # tạo tệp 2 dòng, 4 từ
wc draft.txt # số dòng, số từ, số byte cùng lúc
wc -l draft.txt # 2 (chỉ số dòng)
ls | wc -l # nhận từ pipe: đếm số tệp
Chuyển đổi ký tự — tr
tr thay thế các ký tự từ đầu vào chuẩn theo từng ký tự. tr 'a-z' 'A-Z' chuyển chữ thường thành chữ hoa. tr -s nén chuỗi lặp của cùng một ký tự thành một (ví dụ gộp các dấu cách liên tiếp), còn tr -d xóa các ký tự bạn chỉ định. tr không nhận tên tệp làm đối số — nó đọc từ pipe hoặc chuyển hướng đầu vào.
| Cú pháp | Ý nghĩa |
|---|---|
tr 'a-z' 'A-Z' | Chuyển chữ thường thành chữ hoa |
tr -s ' ' | Nén các ký tự lặp liên tiếp thành một |
tr -d 'x' | Xóa các ký tự được chỉ định |
-s) và xóa (-d).echo 'hello linux' | tr 'a-z' 'A-Z' # HELLO LINUX
echo 'a b c' | tr -s ' ' # nén các dấu cách lặp -> a b c
echo 'a-b-c' | tr -d '-' # xóa - -> abc
Chia đầu ra cho màn hình và tệp — tee
tee nhận nội dung từ pipe, hiển thị lên màn hình và đồng thời ghi vào tệp. Dùng nó khi bạn muốn lưu lại kết quả trung gian mà vẫn chuyển dữ liệu cho lệnh tiếp theo. Nối chuỗi như lệnh | tee out.txt | lệnh tiếp theo, nó ghi vào out.txt trong khi pipeline vẫn chạy tiếp. Để ghi nối vào cuối tệp có sẵn thay vì ghi đè, dùng tee -a.
| Cú pháp | Ý nghĩa |
|---|---|
tee out.txt | Ghi ra cả màn hình lẫn tệp (ghi đè) |
tee -a out.txt | Hiển thị lên màn hình và ghi nối vào cuối tệp |
tee hiển thị nội dung nhận được lên màn hình, ghi vào tệp, và bạn có thể kiểm tra lại sau bằng cat.ls | tee list.txt # hiển thị danh sách và lưu vào list.txt
cat list.txt # trong tệp cũng có
echo 'extra' | tee -a list.txt # -a ghi nối thay vì ghi đè
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2cut -d',' -f1 users.csv in ra gì?
Câu 3Điều gì xảy ra khi bạn chạy echo hi | tee out.txt?