Học bằng cách đọc theo thứ tự

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 12), nên sắp xếp số cần -n.

Cú phápÝ nghĩa
sortSắp xếp các dòng theo thứ tự từ điển
sort -nSắp xếp các dòng theo giá trị số
sort -rĐảo ngược thứ tự (giảm dần)
sort là thứ tự từ điển, sort -n là thứ tự số
so sánh như chữsort10 2 30nums.txt10 2 30so sánh như sốsort -n2 10 30
Thứ tự từ điển so sánh ký tự đầu, nê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ố)

① Tạo tệp ba dòng số với printf '10\n2\n30\n' > nums.txt.

② Sắp xếp bằng sort nums.txt và kiểm tra rằng theo thứ tự từ điển 10 đứng trước 2.

③ Thêm tùy chọn xếp theo số vào sort và kiểm tra thứ tự trở thành 2 → 10 → 30.

④ Sau đó thêm tùy chọn đảo ngược và kiểm tra các dòng được xếp từ lớn đến nhỏ. (Chạy đúng thì phần giải thích sẽ hiện ra.)

Linux console
0 / 4 đã hoàn thành
Loading Linux Terminal...

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
uniqGộp các dòng giống nhau liền kề thành một
sort file.txt | uniqSắp xếp trước để gộp cả các dòng trùng ở xa nhau
uniq -cGắn số lần xuất hiện vào đầu mỗi dòng
Sắp xếp trước, rồi gộp với uniq
b a asorta b b (liền kề)uniqabhết trùng lặp
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)

① Tạo tệp năm dòng có trùng lặp bằng printf 'pear\nfig\npear\nfig\nfig\n' > fruit.txt.

② Sắp xếp bằng sort fruit.txt và kiểm tra các dòng giống nhau nằm cạnh nhau.

③ Chuyển đầu ra của sort qua pipe vào uniq và kiểm tra các dòng trùng được gộp thành một.

④ Trong cùng pipe đó, thêm tùy chọn đếm số lần xuất hiện cho uniq và kiểm tra mỗi dòng có số đếm ở đầu.

Linux console
0 / 4 đã hoàn thành
Loading Linux Terminal...

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',' -f1Trích trường 1 của các dòng phân cách bằng dấu phẩy
cut -d':' -f1Trích trường 1 của các dòng phân cách bằng :
cut -d',' -f1,3Trích trường 1 và 3 cùng lúc
cut tách theo dấu phân cách và chọn trường
cut -d',' -f1sato,30,tokyotrường 1satotrường 230trường 3tokyo-f1: chỉ satotách làm 3 theo dấu phẩy
Dòng được tách theo dấu phân cách của -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

① Tạo tệp phân cách bằng dấu phẩy với printf 'sato,30,tokyo\nito,25,osaka\n' > people.csv.

② Dùng cut với dấu phân cách là dấu phẩy để trích chỉ trường 1 (tên).

③ Sau đó trích trường 1 và 3 cùng lúc và kiểm tra cách chỉ định nhiều trường.

Linux console
0 / 3 đã hoàn thành
Loading Linux Terminal...

Đế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
wcIn số dòng, số từ và số byte cùng lúc
wc -lChỉ in số dòng
wc -wChỉ in số từ
wc -cChỉ in số byte
wc đếm ba con số
memo.txtgood morning / hellowc -lwc -wwc -c2 dòng3 từ19 byte
Cùng một đầu vào — tùy chọn quyết định đếm cái gì.
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

① Tạo tệp hai dòng với printf 'good morning\nhello\n' > memo.txt.

② Chạy wc memo.txt và kiểm tra ba con số hiện ra: dòng, từ và byte.

③ Thêm tùy chọn chỉ in số dòng và kiểm tra nó hiển thị 2.

④ Sau đó thêm tùy chọn chỉ in số từ và kiểm tra nó hiển thị 3.

Linux console
0 / 4 đã hoàn thành
Loading Linux Terminal...

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
tr chuyển đổi, nén và xóa ký tự
hellotr 'a-z' 'A-Z'HELLOa b(3 dấu cách)tr -s ' 'a b(1 dấu cách)a-b-ctr -d '-'abc
Từ trên xuống: chuyển đổi (thường → hoa), nén chuỗi lặp (-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

① Chuyển đầu ra của echo 'desktech learn' qua pipe vào tr và đổi chữ thường thành chữ hoa.

② Tiếp theo, chuyển đầu ra của echo 'x y z' vào tr và dùng tùy chọn nén các dấu cách lặp thành một.

③ Chuyển đầu ra của echo 'a-b-c' vào tr và dùng tùy chọn xóa để thu được abc.

Linux console
0 / 3 đã hoàn thành
Loading Linux Terminal...

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.txtGhi ra cả màn hình lẫn tệp (ghi đè)
tee -a out.txtHiển thị lên màn hình và ghi nối vào cuối tệp
tee gửi đầu ra tới cả màn hình lẫn tệp
echo hi| tee out.txt| lệnh tiếp theohi trên màn hìnhout.txt cũng có hipipeline tiếp tụccat out.txthi vẫn còn đó
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 đè

① Chuyển đầu ra của echo 'one two' qua pipe vào tee để ghi vào note.txt, và kiểm tra nội dung đó cũng hiện trên màn hình.

② Chạy cat note.txt để kiểm tra nội dung đó cũng nằm trong tệp.

③ Tiếp theo, ghi nối đầu ra của echo 'three' vào cuối note.txt bằng tùy chọn ghi nối của tee.

④ Chạy lại cat note.txt và kiểm tra tệp đã tăng lên hai dòng.

Linux console
0 / 3 đã hoàn thành
Loading Linux Terminal...
QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1uniq coi những dòng nào là trùng lặp?

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?