Lọc từng dòng dữ liệu trong linux
Bài viết này giới thiệu với các bạn về đường ống (Pipe), lọc (Filter) và chuyển hướng (Redirection) trên hệ điều hành Linux qua khái niệm và ví dụ dưới đây sẽ giúp cho các bạn có thể tự nghiên cứu và tự học Linux cơ bản một cách dễ dàng. Đường ống (pipe) dùng để chuyển hướng trên hệ điều hành Linux, nó cho phép chúng ta sử dụng hai hoặc nhiều lệnh sao cho đầu ra của một lệnh đóng vai trò trực tiếp làm đầu vào của lệnh tiếp theo. Kết nối trực tiếp giữa các lệnh cho phép chúng hoạt động đồng thời và cho phép dữ liệu được truyền giữa chúng liên tục thay vì phải chuyển qua các tệp văn bản tạm thời hoặc qua màn hình hiển thị. Các đường ống là một chiều tức là luồng dữ liệu chuyển hướng từ trái
sang phải qua đường ống. Biểu tượng Các đường ống (pipe) giúp chúng ta có thể kết hợp hai hoặc nhiều lệnh cùng lúc và chạy chúng liên tiếp. Cú pháp như sau: Chúng ta thực hiện một số ví dụ bên dưới để dể hiểu hơn: Ví dụ 1: Sử dụng đường ống để kết hợp lệnh Khi chúng ta sử dụng lệnh Để có thể xem toàn bộ nội dung tệp chúng ta có thể chuyển hướng đầu ra của lệnh Chúng ta nhấn Enter để di chuyển sang từ dòng, nhấn space để di chuyển sang một trang và nhấn q để thoát. Ví dụ 2: Sử dụng lệnh Ví dụ 3: Sử dụng head và tail để in các dòng trong một tệp. Lệnh này sẽ lấy 9 dòng đầu tiên của tệp Ví dụ 4: Sử dụng ls và find để liệt kê và in tất cả các dòng khớp trong một tệp. Lệnh trên sẽ giúp chúng ta chọn các tệp có phần mở rộng Ví dụ 5: Sử dụng lệnh cat, grep, tee và wc để thực hiện chọn từ Sự khác biệt giữa đường ống (pipe) thông thường và đường ống có tên (named pipe). Đường ống có tên (named pipe) có sự hiện diện trong hệ thống tệp hiển thị dưới dạng file
chúng không giống các file thông thường và chúng sẽ không có nội dung. Cho dù bạn có ghi nhiều dữ liệu vào một đường ống có tên (named pipe), thì file dường như trống. Việc sử dụng đường ống có tên (named pipe) rất hữu ích khi thực hiện di chuyển dữ liệu giữa các tiến trình. Dữ liệu của một đường ống có tên được chứa trong bộ nhớ chứ không phải được ghi vào đĩa. Đường ống có tên chỉ được thông qua khi cả hai đầu của ống đã được mở. Chúng ta có thể nạp dữ liệu nào một đường ống nhiều lần
trước khi mở ở đầu kia và đọc. Bằng cách sử dụng các đường ống được có tên, bạn có thể thiết lập một tiến trình ghi vào một đường ống và một tiến trình khác đọc từ đường ống. Thiết lập một đường ống có tên (named pipe) Chúng ta sử dụng lệnh Lưu ý: Loại tệp đặc biệt có chỉ định là p và độ dài của tệp bằng không. Trong các hệ
thống Linux cũ, đường ống có tên (named pipe) được tạo bằng lệnh Chúng ta có thể ghi vào đường ống có tên bằng cách chuyển hướng đầu ra đến nó và độ dài của nó vẫn bằng không. Chúng ta sẽ đổ dữ liệu đường ống bằng cách chạy lệnh sau: Văn bản của chúng ta đã được đỗ vào đường ống. Bạn có thể ở đầu ra và đọc dữ liệu được đổ vào từ đường ống như sau: Một cách khác để xem cách một ống có tên hoạt động là thực hiện
cả hai thao tác (đổ dữ liệu vào ống và lấy nó ở đầu kia) bằng cách đặt phần đổ vào nền.
Ví dụ: Bạn có thể thiết lập một tiến trình chỉ đơn giản là chờ dữ liệu xuất hiện ở đầu ra của ống. Chúng ta sử dụng lệnh Chúng ta sẽ chạy lệnh sau tại đầu ra đễ chờ dữ liệu xuất hiện:
Trong đầu vào chúng ta thực hiện nhập:
Quay lại kiểm tra đầu ra của dử liệu ta được kết quả như sau:
Trong thực tế nhiều lúc chúng ta cần thực hiện nhiệm vụ di chuyển dữ liệu giữa các tiến trình chúng ta sẽ sử dụng tính năng hay của named pipe này. 2. Giới thiệu về (filter)Một đường ống có thể chuyển đầu ra tiêu chuẩn của một hoạt động sang đầu vào tiêu chuẩn của một hoạt động khác, nhưng một bộ lọc có thể sửa đổi luồng. Một bộ lọc (filter) trên hệ điều hành Linux là một chương trình có nhiệm vụ lấy đầu vào tiêu chuẩn, thực hiện xử lý và sau đó ghi kết quả vào đầu ra tiêu chuẩn. Linux có một số lượng lớn các bộ lọc. Một số bộ lọc (filter) thường sử dụng:
Một số ví dụ cơ bản về lọc (filter): 👉 Ví dụ 1: Sử dụng lệnh sort để sắp xếp các dòng trong file.txt theo thứ tự a đến z và ngược lại:
👉 Ví dụ 2: Dùng lệnh head xem 3 dòng đầu của file test.txt. Chúng ta chạy lệnh sau để thực hiện:
👉 Ví dụ 3: Dùng lệnh tail xem 3 dòng cuối của file test.txt:
👉 Ví dụ 4: Dùng lệnh wc đếm số dòng trong file test.txt:
👉 Ví dụ 5: Dùng lệnh
👉 Ví dụ 6: Sử dụng lệnh sed để in và thay thế. Thực hiện như bên dưới:
👉 Ví dụ 7: Dùng lệnh uniq để lọc các dòng trùng lặp trong file test.txt. Chúng ta thưc hiện như sau:
👉 Ví dụ 8: Dùng lệnh awk in các dòng trong file:
👉 Ví dụ 9: Dùng lệnh
3. Giới thiệu về RedirectionChuyển hướng (redirection) là một tính năng mạnh mẽ trên hệ điều hành Linux để khi thực hiện lệnh chúng ta có thể thay đổi các thiết bị đầu vào/đầu ra tiêu chuẩn. Với tính năng chuyển hướng, các lệnh của chúng ta có thể gửi và nhận luồng dữ liệu đến từ các tệp và thiết bị, cũng như cho phép chúng ta kết nối các chương trình khác với nhau thành các đường ống. File descriptor (mô tả tập tin) mặc định 0, 1, 2. Bất cứ khi nào chúng ta thực hiện một chương trình/lệnh tại thiết bị đầu cuối, nó sẽ mở ba mô tả tệp (File descriptor) tiêu chuẩn: stdin (mô tả tệp 0), stdout (mô tả tệp 1) và stderr (mô tả tệp 2). Chúng ta có thể mở thêm các mô tả tệp (như 3,4,5... và đóng chúng). Bạn cũng có thể sao chép mô tả tệp. Bộ mô tả tệp luôn trỏ đến một số tệp (trừ khi chúng bị đóng). Đầu vào được đọc từ những gì bạn nhập vào thiết bị đầu cuối và cả hai đầu ra được gửi đến thiết bị đầu cuối. Khi bash chạy một lệnh, nó sẽ tạo ra một tiến trình con (chạy lệnh sau: 3.1.Chuyển hướng đầu ra3.1.1. Chuyển hướng đầu ra tiêu chuẩn của lệnh sang tệpBiểu tượng Lệnh Ví dụ:
Qua ví dụ trên thì đầu ra của lệnh
Nếu bạn không muốn một tập tin bị ghi đè và muốn thêm nhiều nội dung vào một tập tin hiện có, thì bạn nên sử dụng 3.1.2. Chuyển hướng lỗi tiêu chuẩn của lệnh sang tệpLệnh Ví dụ như sau:
Bash mở file để viết, lấy file descriptor của tệp này và nó thay thế file descriptor 2 bằng file descriptor của tệp này. Vì vậy, bây giờ bất cứ gì được viết cho stderr được ghi vào tập tin. 3.1.3. Chuyển hướng cả đầu ra tiêu chuẩn và lỗi tiêu chuẩn sang một tệp👉 Ví dụ 1: Trong ví dụ này chúng ta sử dụng cú pháp như sau: Minh hoạt cho ví dụ trên:
Ngoài ra bạn cũng có thể chuyển hướng cả hai luồng đầu ra stdout và stderr đến cùng một đích bằng cách thực hiện chuyển từng luồng như lệnh bên dưới:
Khi bash thấy một lệnh chuyển hướng thì nó sẽ xử lý chúng theo chiều từ trái sang phải. Trước khi thực hiện chạy một lệnh thì bảng mô tả tệp của bash như thế này: Trong lệnh trên thì đầu tiên bash sẽ xử lý chuyển hướng Tiếp theo bash sẽ chuyển hướng
Cả hai luồng đầu ra stdout và stderr đều được chuyển hướng đến file. 👉 Ví dụ 2: Lệnh Chúng ta cần thực hiện các bước của lệnh trên sẽ chạy để hiểu cách hoạt động của chúng. Đầu tiên trước khi chạy một lệnh, bảng mô tả tệp trông như thế này: Tiếp theo bash sẽ thực hiện tiến trình chuyển hướng từ trái sang phải. Nó sẽ thực hiện Tiếp theo thì bash sẽ thực hiện chuyển hướng thứ hai Bây giờ thì stdout trỏ đến file nhưng stderr trỏ đến thiết bị đầu cuối. Mọi thứ ghi vào stderr vẫn được in ra màn hình.
3.1.4. Mở tệp để đọc bằng mô tả tệp tùy chỉnhLệnh Bạn có thể đọc một dòng từ bộ mô tả tập tin 3 bằng lệnh sau:
Sau khi sử dụng xong fd3, bạn có thể đóng nó theo cách này:
Ví dụ 1: Mở tệp để viết bằng mô tả tệp tùy chỉnh Lệnh Mô tả tệp không phải được sử dụng theo thứ tự, bạn có thể mở bất kỳ số mô tả tệp nào bạn muốn từ 0 đến 255. Chúng ta thực hiện viết vào phần mô tả tệp 4:
Để đóng bộ mô tả tệp 4:
Ví dụ 2: Mở một tệp cả để viết và đọc Lệnh
3.1.5. Truy cập một trang web thông qua bashBash xem tệp Trong ví dụ này, chúng ta mở bộ mô tả tệp 5 có thể đọc, viết và trỏ nó vào tệp đặc biệt
Tiếp theo ghi "GET / HTTP/1.1\n\n" vào bộ mô tả tệp 5. Và thực hiện đọc bộ mô tả tệp bằng lệnh
3.2. Chuyển hướng đầu vàoTheo mặc định, đầu vào tiêu chuẩn được nhập từ bàn phím, nhưng chúng ta có thể sử dụng biểu tượng Ví dụ: Sử dụng lệnh
Ý
nghĩa của lệnh 4. Lời kếtQua bài trên, giúp cho chúng ta biết các định nghĩa cùng với một số ví dụ cơ bản minh họa về việc sử dụng đường ống (Pipe), lọc (Filter) và chuyển hướng (Redirection) trên hệ điều hành Linux để chúng ta có thể áp dụng vào thực tế một cách tốt nhất. |