NỘI DUNG

Hosting tốc độ cao Vietnix - tốc độ tải trang trung bình dưới 1 giây
VPS siêu tốc Vietnix - trải nghiệm mượt mà, ổn định
29/08/2024
Lượt xem

Bash Piping – 5 ví dụ chi tiết về cách hoạt động chuyển tiếp lệnh

29/08/2024
14 phút đọc
Lượt xem

Đánh giá

Bash Piping trong Linux là kỹ thuật cho phép bạn kết nối nhiều lệnh lại với nhau. Điều này giúp bạn thực hiện các tác vụ phức tạp một cách hiệu quả và linh hoạt hơn. Hãy cùng Vietnix tìm hiểu về Piping, tầm quan trọng và các ví dụ sử dụng của bash Piping trong bài viết này.

Hiểu đúng về cách hoạt động của Piping trong Bash Script

Piping trong Linux về cơ bản là cách chúng ta truyền output của một lệnh (stdout) làm input cho một lệnh khác (stdin). Hãy tưởng tượng Piping như một đường ống nối giữa các lệnh, cho phép chúng hoạt động cùng lúc và trao đổi dữ liệu liên tục, mà không cần phải lưu trữ tạm thời vào file hay hiển thị lên màn hình. Bạn có thể xem hình minh họa dưới đây để hiểu rõ hơn:

Định nghĩa về Bash Piping
Định nghĩa về Bash Piping

Như hình ảnh, bạn có thể nghĩ rằng Lệnh 2 chỉ nhận input sau khi Lệnh 1 đã hoàn thành, nhưng thực tế không phải vậy. Bash sẽ khởi chạy tất cả các chương trình cùng một lúc khi được hiện chạy tập lệnh Bash và thiết lập input & output tương ứng. Mỗi chương trình sử dụng output từ chương trình trước đó và chuyển output của mình cho chương trình tiếp theo, theo đúng thứ tự các lệnh. Bash I/O sẽ là nhóm những thao tác input/output giúp bạn nắm bắt rõ về quy trình.

Bạn có thể xem thêm về cách hoạt động của Bash Input và Bash Output được định dạng và hiển thị như thế nào trong Bash Script nhằm hiểu rõ hơn về Bash Piping.

Ngoài việc đóng vai trò như một shell như cách hoạt động Piping, Bash còn được xem là một dòng lệnh hữu ích (lệnh bash) trong hệ điều hành Linux. Vậy Bash có phải là một ngôn ngữ lập trình như người dùng thường hiểu.

5 ứng dụng của Bash Piping trong Linux

Ứng dụngMô tả
ĐếmĐếm số lượng dòng, từ, hoặc ký tự trong output của một lệnh
Kết hợpGhép output của nhiều lệnh lại với nhau
Sắp xếpSắp xếp output của một lệnh theo thứ tự tăng dần hoặc giảm dần
LọcChọn lọc những dòng dữ liệu cụ thể từ output của một lệnh
Tự động hóa tác vụTạo các chuỗi lệnh phức tạp để thực hiện các tác vụ lặp đi lặp lại một cách tự động
Tính toán trên dữ liệuThực hiện các phép tính toán trực tiếp trên dữ liệu từ output của một lệnh
Thay đổi và chuyển đổi dữ liệuChuyển đổi định dạng hoặc nội dung của dữ liệu từ output của một lệnh

Cú pháp cơ bản của Bash Piping

Piping hoạt động theo nguyên tắc một chiều, dữ liệu được truyền từ lệnh bên trái sang lệnh bên phải và ký tự “|” được sử dụng để kết nối các lệnh. Cú pháp cơ bản của Piping đó là:

Command 1 | command 2 | … | Command N

Trong đó:

  • Command 1, command 2,…, command N: Là các lệnh Linux mà bạn muốn kết nối với nhau.
  • |: Là ký tự pipe, dùng để chuyển kết quả đầu ra của lệnh bên trái thành đầu vào cho lệnh bên phải.

Ví dụ 1: Đọc từ một Pipe trong Bash

Bạn có thể sử dụng lệnh read để đọc dữ liệu từ pipe trong một script Bash. Lệnh read sẽ đọc một dòng từ đầu vào chuẩn (stdin) và gán cho một biến.

Ví dụ dưới đây là lệnh echo được thực hiện và được đọc bởi lệnh read :

echo "Hello everyone"  | { read name; echo "name=$name"; }

    • echo “Hello everyone”: Lệnh này in ra màn hình dòng chữ “Hello everyone”.

    • |: Ký tự pipe chuyển kết quả đầu ra của lệnh echo (dòng chữ “Hello everyone”) thành đầu vào cho lệnh tiếp theo.

    • { read name; echo “name=$name”; }:
        • read name: Lệnh read đọc dòng chữ “Hello everyone” từ pipe và gán cho biến ten.

        • echo “name=$name”: Lệnh echo in ra màn hình giá trị của biến ten, lúc này là “Hello everyone”.

Kết quả là sẽ in ra màn hình dòng chữ name=Hello everyone như hình minh hoạ bên dưới.

màn hình hiện dòng chữ name=Hello everyone
Màn hình hiện dòng chữ name=Hello everyone

Ví dụ 2: Đưa output vào một file trong Linux

Để chuyển hướng output của một lệnh sang một file trong Linux, bạn sử dụng ký tự > sau lệnh. Thực hiện 2 dòng lệnh lệnh lslệnh grep để bắt đầu ví dụ sau:

ls | grep '.txt' > text_files

Giải thích lệnh:

  • Lệnh ls liệt kê nội dung thư mục hiện tại.
  • Lệnh grep '.txt' lọc ra các file có đuôi .txt.
  • Ký tự > chuyển hướng đầu ra của lệnh grep vào file text_files.

Sau khi chạy lệnh trên, bạn sẽ thấy một file mới tên là text_files được tạo ra trong thư mục hiện tại. File này chứa danh sách tất cả các file có đuôi .txt trong thư mục.

một file mới tên là text_files được tạo ra trong thư mục hiện tại. File này chứa danh sách tất cả các file có đuôi .txt trong thư mục
một file mới tên là text_files được tạo ra trong thư mục hiện tại. File này chứa danh sách tất cả các file có đuôi .txt trong thư mục

Ví dụ 3: Dùng Pipe (|) để gán dữ liệu vào biến trong Bash

Với Bash pipe, bạn có thể sử dụng cú pháp thay thế lệnh (command substitution)để lấy dữ liệu từ một chuỗi lệnh (pipe) và gán nó vào một biến. Ví dụ:

echo 'Hello!' | { read message; echo "$message" ;  }

Giải thích lệnh:

  • echo ‘Hello!’: Lệnh này in ra dòng chữ “Hello!”.
  • |: Ký tự pipe chuyển kết quả đầu ra của lệnh echo (dòng chữ “Hello!”) thành đầu vào cho lệnh tiếp theo.
  • { read message; echo “$message” ;  }:

    • read message: Lệnh read đọc dòng chữ “Hello!” từ pipe và gán cho biến message.
    • echo “$message”: Lệnh echo in ra giá trị của biến message, lúc này là “Hello!”.

Kết quả là sẽ in ra màn hình: Hello!

Kết quả là sẽ in ra màn hình: Hello
Kết quả là sẽ in ra màn hình: Hello

Ví dụ 4: Sử dụng Bash Pipe để điều khiển nhiều lệnh cùng lúc

Bạn có thể dùng pipe (|) để chuyển kết quả của một lệnh làm đầu vào cho hai lệnh khác cùng lúc.

Giả sử, bạn muốn chuyển kết quả của lệnh ls đến kết quả làm đầu vào của lệnh tee và cuối cùng là kết quả đầu ra bằng lệnh wc:

ls -l |  tee > (grep '.txt' | wc -l)

Giải thích lệnh:

  • ls -l: Lệnh này liệt kê tất cả các nội dung trong thư mục hiện tại.
  • |: Ký tự pipe chuyển kết quả đầu ra của lệnh ls -l thành đầu vào cho lệnh tiếp theo.
  • tee: Lệnh này đọc dữ liệu từ đầu vào chuẩn (stdin) và ghi dữ liệu đó vào cả đầu ra chuẩn (stdout) và một hoặc nhiều đích khác.
  • >(grep ‘.txt’ | wc -l): Đây là phần thay thế tiến trình (process substitution), cho phép bạn chạy một chuỗi lệnh kết hợp giữa lệnh grep và lệnh wc -l.

    • grep ‘.txt’: Lệnh này lọc các file có đuôi “.txt”.
    • wc -l: Lệnh này đếm số dòng trong kết quả đầu ra của lệnh grep, tức là đếm số lượng file có đuôi “.txt”.

Kết quả: Bạn sẽ thấy danh sách các file trên màn hình và số lượng file có đuôi .txt được in ra như hình bên dưới.

Danh sách các file trên màn hình và số lượng file có đuôi .txt được in ra
Danh sách các file trên màn hình và số lượng file có đuôi .txt được in ra

Ví dụ 5: Sử dụng Bash Double Pipe

Double Pipe || trong Bash được sử dụng để thực hiện điều kiện. Lệnh bên phải chỉ chạy khi lệnh bên trái thất bại (trả về trạng thái thoát (exit status) khác 0). Cú pháp cơ bản của lệnh như sau:

command1 | | command2

Giả sử bạn muốn thử xóa một file bằng lệnh rm, nhưng nếu file đó không tồn tại, bạn có thể tạo file đó bằng lệnh touch như sau:

rm logic.txt || touch logic.txt

Giải thích lệnh:

  • rm logic.txt: Lệnh này cố gắng xóa file “logic.txt”.

    • Nếu file tồn tại thì sẽ bị xóa và lệnh rm trả về trạng thái thoát là 0 (thành công). Lệnh touch logic.txt sẽ không được thực thi.
    • Nếu file không tồn tại, lệnh rm trả về trạng thái thoát khác 0 (thất bại).

  • ||: Double pipe kiểm tra trạng thái thoát của lệnh rm.

    • Nếu trạng thái thoát là 0 (thành công), lệnh touch logic.txt sẽ bị bỏ qua.
    • Nếu trạng thái thoát khác 0 (thất bại), lệnh touch logic.txt sẽ được thực thi.

  • touch logic.txt: Lệnh này tạo một file mới tên là logic.txt.

 lệnh rm logic.txt cố gắng xóa file "logic.txt" nhưng không thành công vì file không tồn tại
lệnh rm logic.txt cố gắng xóa file “logic.txt” nhưng không thành công vì file không tồn tại

Trong hình minh hoạ ở trên, bạn có thể thấy lệnh rm logic.txt cố gắng xóa file “logic.txt” nhưng không thành công vì file không tồn tại. Do đó, lệnh tiếp theo touch logic.txt được thực thi để tạo file mới. Mặc dù có thông báo lỗi từ lệnh rm nhưng file mới đã được tạo thành công.

8 lợi ích của việc sử dụng Bash Piping

Bash Piping mang lại 8 lợi ích về hiệu suất và khả năng quản lý dữ liệu trong Bash.

  1. Quy trình hiệu quả: Piping cho phép bạn nối nhiều lệnh lại với nhau, tạo thành một chuỗi xử lý dữ liệu liền mạch.
  2. Phân chia công việc: Bạn có thể chia nhỏ tác vụ phức tạp thành các lệnh đơn giản, dễ quản lý.
  3. Tiết kiệm tài nguyên: Piping giúp tránh tạo file tạm, giảm sử dụng ổ cứng và chi phí I/O.
  4. Chuyển đổi dữ liệu linh hoạt: Bạn có thể dễ dàng xử lý, lọc, sắp xếp và biến đổi dữ liệu bằng cách sử dụng các lệnh khác nhau trong một pipe.
  5. Tiết kiệm thời gian, tăng tốc độ xử lý: Việc không cần lưu trữ kết quả trung gian giúp tiết kiệm thời gian cho việc ghi và quản lý các file tạm thời.
  6. Xử lý song song: Các lệnh trong pipe có thể chạy đồng thời, giúp tăng hiệu suất.
  7. Tự động hóa: Bạn có thể dễ dàng tạo script và quy trình tự động hóa các tác vụ phức tạp.
  8. Dễ dàng tìm lỗi: Bạn có thể quan sát dòng dữ liệu qua từng lệnh để xác định lỗi. Nếu có lỗi xảy ra, bạn có thể dễ dàng khoanh vùng và sửa chữa lỗi dựa trên kết quả đầu ra của từng lệnh trong pipe.

Câu hỏi thường gặp

Điểm khác biệt Sự khác biệt giữa |>>> trong Bash piping

|> : Kết nối đầu ra của một lệnh với đầu vào của lệnh khác
>> (Append): Thêm đầu ra của một lệnh vào cuối một file

Có thể sử dụng pipe để thực hiện các phép toán số học không?

Có thể, nhưng không trực tiếp vì pipe không phải là công cụ tính toán trực tiếp.

Có thể sử dụng pipe để tạo một vòng lặp không?

Câu trả lời là không. Pipe chỉ kết nối input một lệnh khác với output một lệnh và không có khả năng lặp lại lệnh.

Lời kết

Bash Piping là công cụ không thể thiếu cho người dùng Linux muốn tối ưu hóa dòng lệnh. Với khả năng kết nối các lệnh một cách linh hoạt, bạn có thể xử lý dữ liệu hiệu quả hơn và đơn giản hóa các tác vụ phức tạp. Bạn hãy áp dụng Piping trong Bash vào công việc hàng ngày để nâng cao năng suất làm việc của mình!

THEO DÕI VÀ CẬP NHẬT CHỦ ĐỀ BẠN QUAN TÂM

Đăng ký ngay để nhận những thông tin mới nhất từ blog của chúng tôi. Đừng bỏ lỡ cơ hội truy cập kiến thức và tin tức hàng ngày

Chọn chủ đề :

Hưng Nguyễn

Co-Founder
tại

Kết nối với mình qua

Kết nối với mình qua

Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận

Tăng tốc độ website - Nâng tầm giá trị thương hiệu

Tăng tốc tải trang

95 điểm

Nâng cao trải nghiệm người dùng

Tăng 8% tỷ lệ chuyển đổi

Thúc đẩy SEO, Google Ads hiệu quả

Tăng tốc ngay

SẢN PHẨM NỔI BẬT

7 NGÀY DÙNG THỬ HOSTING

NẮM BẮT CƠ HỘI, THÀNH CÔNG DẪN LỐI

Cùng trải nghiệm dịch vụ hosting tốc độ cao được hơn 100,000 khách hàng sử dụng

ĐĂNG KÝ NHẬN TÀI LIỆU THÀNH CÔNG
Cảm ơn bạn đã đăng ký nhận tài liệu mới nhất từ Vietnix!
ĐÓNG

ĐĂNG KÝ DÙNG THỬ HOSTING

7 NGÀY MIỄN PHÍ

ĐĂNG KÝ DÙNG THỬ HOSTING

7 NGÀY MIỄN PHÍ

XÁC NHẬN ĐĂNG KÝ DÙNG THỬ THÀNH CÔNG
Cảm ơn bạn đã đăng ký thông tin thành công. Đội ngũ CSKH sẽ liên hệ trực tiếp để kích hoạt dịch vụ cho bạn nhanh nhất!
ĐÓNG