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

Pipe — Kết nối lệnh

Tìm hiểu cách pipe truyền đầu ra của một lệnh sang lệnh tiếp theo, đếm dòng bằng wc -l, sắp xếp bằng sort, và kết hợp cổ điển sort | uniq để loại bỏ trùng lặp — thực hành ngay trên terminal trong trình duyệt.

Pipe là gì — ký hiệu |

Pipe | là ký hiệu truyền đầu ra của một lệnh thẳng vào lệnh tiếp theo làm đầu vào của nó.

Bằng cách xử lý kết quả của một lệnh với lệnh khác, bạn kết hợp các lệnh nhỏ lại để hoàn thành công việc.

Đây là triết lý thiết kế Unix — xây dựng quy trình xử lý bằng cách kết nối các công cụ đơn mục đích.

Đầu ra chảy vào đầu vào tiếp theo
cat fruits.txt|wc -lxuất 3 dòngtruyền đầu ralàm đầu vàonhận và hiển thịsố dòng 3
| truyền đầu ra bên trái làm đầu vào bên phải, kết nối các lệnh đơn mục đích.
echo apple > fruits.txt      # tạo dòng 1
echo banana >> fruits.txt    # nối thêm
echo cherry >> fruits.txt    # nối thêm
cat fruits.txt | wc -l       # đếm dòng -> 3
ls / | wc -l                 # số mục trong thư mục gốc

① Tạo dòng 1 bằng echo apple > fruits.txt, rồi nối thêm bằng echo banana >> fruits.txtecho cherry >> fruits.txt để tạo tệp dữ liệu 3 dòng.

② Truyền đầu ra của cat fruits.txt vào wc -l qua pipe, và xác nhận số dòng được hiển thị.

③ Xác nhận con số hiển thị khớp với số dòng trong dữ liệu. (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...

Bất kỳ lệnh nào cũng có thể kết nối

Pipe không bị ràng buộc vào các lệnh cụ thể.

Bất kỳ lệnh nào tạo ra đầu ra chuẩn và bất kỳ lệnh nào chấp nhận đầu vào chuẩn đều có thể kết nối tự do.

Có vô số kết hợp: ls | wc -l để đếm tệp, cat file | sort để sắp xếp, v.v.

echo log1 > lines.txt    # tạo dòng 1
echo log2 >> lines.txt   # nối thêm
echo log3 >> lines.txt   # nối thêm
cat lines.txt | wc -l    # 3
ls /etc | wc -l          # số mục trong /etc

① Tạo dòng 1 bằng echo x > items.txt, rồi nối thêm bằng echo y >> items.txtecho z >> items.txt để tạo dữ liệu 3 dòng.

② Truyền đầu ra của cat items.txt vào sort qua pipe, và xác nhận các dòng được hiển thị theo thứ tự bảng chữ cái.

③ Tiếp theo, truyền đầu ra của cat items.txt vào sort, rồi chạy pipe 3 tầng kết nối kết quả vào wc -l bằng thêm một pipe nữa, và xác nhận số dòng được hiển thị.

Linux console
0 / 5 đã hoàn thành
Loading Linux Terminal...
LệnhVai trò trong pipe
|Truyền đầu ra bên trái làm đầu vào bên phải
wc -lĐếm số dòng nó nhận được
sortSắp xếp các dòng nó nhận được theo thứ tự bảng chữ cái
uniqGộp các dòng trùng liền kề thành một
head / tailLấy phần đầu / cuối của những gì nó nhận được

Sắp xếp — sort

sort là lệnh sắp xếp các dòng nó nhận được.

Mặc định nó sắp xếp theo thứ tự bảng chữ cái (thứ tự chuỗi).

Nó có thể nhận đầu ra của lệnh trước qua pipe và truyền kết quả đã sắp xếp ra màn hình hoặc lệnh tiếp theo.

sort sắp xếp dòng theo bảng chữ cái
cat fruits.txt|sortbanana / apple / cherrytruyền đầu ralàm đầu vàoapple / banana /cherry (đã sắp xếp)
sort sắp xếp các dòng nhận được qua pipe theo thứ tự bảng chữ cái và xuất ra.
echo banana > fruits.txt     # tạo không theo thứ tự
echo apple >> fruits.txt
echo cherry >> fruits.txt
cat fruits.txt | sort        # sắp xếp thành apple / banana / cherry

① Tạo dòng 1 bằng echo banana > fruits.txt, rồi nối thêm bằng echo apple >> fruits.txtecho cherry >> fruits.txt để tạo 3 dòng không theo thứ tự.

② Truyền đầu ra của cat fruits.txt vào sort qua pipe, và xác nhận các dòng được hiển thị theo thứ tự bảng chữ cái.

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

Loại bỏ trùng lặp — uniq

uniq là lệnh gộp các dòng trùng lặp liên tiếp thành một.

uniq chỉ xem xét các dòng liền kề, nên không thể gộp các dòng giống nhau ở xa nhau.

Khi muốn đảm bảo giảm trùng lặp thành một dòng, cách thông dụng là sort | uniq: dùng sort để tập hợp các dòng giống nhau cạnh nhau trước, rồi kết nối với uniq.

Tập hợp bằng sort, gộp bằng uniq
cat list.txtsortuniqpear / apple / pear(3 dòng)apple / pear / pear(đã sắp xếp)apple / pear(đã giảm)
sort tập hợp các bản trùng cạnh nhau, và uniq gộp các dòng trùng liên tiếp thành một.
echo pear > list.txt         # tạo với trùng lặp
echo apple >> list.txt
echo pear >> list.txt
cat list.txt | sort          # apple / pear / pear
cat list.txt | sort | uniq   # apple / pear

Dùng sort trước uniq

uniq chỉ xem xét các dòng liền kề là trùng lặp.

Nó không thể gộp các dòng giống nhau ở xa nhau, nên khi muốn giảm trùng lặp thành một dòng, hãy sắp xếp trước bằng sort rồi kết nối với uniq.

① Tạo dòng 1 bằng echo pear > list.txt, rồi nối thêm bằng echo apple >> list.txtecho pear >> list.txt để tạo 3 dòng có chứa trùng lặp.

② Truyền đầu ra của cat list.txt vào sort qua pipe để các dòng giống nhau ở cạnh nhau.

③ Rồi kết nối đầu ra đó vào uniq, và xác nhận các bản trùng liền kề được gộp thành một dòng.

Linux console
0 / 5 đã 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 1Ký hiệu pipe | làm gì?

Câu 2Điều gì được hiển thị khi bạn chạy cat fruits.txt | wc -l?

Câu 3Khi muốn gộp các dòng trùng thành một, lệnh nào hiệu quả để kết nối trước uniq?