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ư 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ụng | Mô tả |
Đếm | Đếm số lượng dòng, từ, hoặc ký tự trong output của một lệnh |
Kết hợp | Ghép output của nhiều lệnh lại với nhau |
Sắp xếp | Sắp xếp output của một lệnh theo thứ tự tăng dần hoặc giảm dần |
Lọc | Chọ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ệu | Thự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ệu | Chuyể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
5 ví dụ về cách sử dụng của Bash Piping
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"; }
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.
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 ls và lệnh grep để bắt đầu ví dụ sau:
ls | grep '.txt' > 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.
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" ; }
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)
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.
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
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.
- 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.
- 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ý.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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 |>
và >>
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!