Một chương trình "lọc" chỉ đơn giản là một chương trình mà đọc từ dòng đầu vào tiêu chuẩn (stdin
) và ghi vào luồng đầu ra tiêu chuẩn (stdout
). Trước khi viết dữ liệu đã đọc, dữ liệu thường được chuyển đổi theo một cách nào đó (nếu bạn không tạo ra bất kỳ phép chuyển đổi hoặc lọc nào, về cơ bản bạn đã viết một chương trình cat
chỉ in ra bất kỳ thứ gì được trao cho nó). Sức mạnh của chương trình lọc xuất phát từ thực tế là họ không ra lệnh nơi đầu vào của họ đến từ đâu hoặc nơi đầu ra sẽ đến. Thay vào đó, nó tùy thuộc vào người gọi của chương trình để cung cấp các kênh đầu vào/đầu ra.
Cốt lõi của một chương trình lọc có thể giống như thế này (bạn có thể sử dụng như là một khuôn mẫu cho các chương trình lọc của riêng bạn):
#include <stdio.h>
int filter(FILE *input, FILE *output);
int main(void)
{
const int retval = filter(stdin, stdout);
fflush(stdout);
return retval;
}
Vậy là xong. Công việc thực tế được thực hiện bởi một hàm filter
thực hiện phép biến đổi mà bạn mong muốn.Ví dụ, đây là một chương trình đơn giản mà đọc ký tự từ tập tin đầu vào, biến chúng thành chữ thường, và sau đó in chúng lại thành file đầu ra:
#include <stdio.h>
#include <ctype.h> /* for tolower */
int filter(FILE *input, FILE *output)
{
while (!feof(input)) {
if (ferror(input)) {
return 1;
}
fputc(tolower(fgetc(input)), output);
}
return 0;
}
int main(void)
{
const int retval = filter(stdin, stdout);
fflush(stdout);
return retval;
}
Nếu bạn biên dịch và chạy chương trình này, nó sẽ chỉ đơn giản là ngồi ở đó và kiên nhẫn chờ dữ liệu đọc từ tập tin đầu vào tiêu chuẩn stdin
. Tệp này thường được liên kết với bảng điều khiển, có nghĩa là bạn phải nhập một số dữ liệu bằng tay. Tuy nhiên, các lệnh shell thực hiện một tính năng gọi là các đường ống cho phép bạn kết nối đầu ra của một lệnh với đầu vào của một lệnh khác. Điều này cho phép soạn nhiều chương trình thành pipeline để tạo các lệnh mạnh mẽ.
Đây là cách chúng ta có thể sử dụng chương trình lọc của chúng tôi (giả sử bạn được gọi là kết quả nhị phân lower
):
$ echo Hello | lower
hello
$
Kể từ khi chương trình lọc của chúng tôi không xác định nơi dữ liệu được đọc đến từ, chúng ta có thể kết hợp nó với tất cả các loại chương trình sản xuất đầu ra trên stdout
. Ví dụ, dưới đây là cách bạn có thể nhận được một tập tin toàn bộ như chữ thường (bạn có thể sử dụng trên các máy Windows type
thay):
$ cat myfile.txt
Hello, World!
This is a simple test.
$ cat myfile.txt | lower
hello, world!
this is a simple test.
$
Tôi có thiếu cái gì? Ngày 1 tháng 4 là một vài ngày trước ... –
Đối với tất cả các công cụ bạn đã đề cập, bạn có thể dễ dàng tìm thấy mã nguồn. Tại sao không có một cái nhìn tại đó để tìm hiểu cách chúng được triển khai? –
@Michael, không, nó xuất hiện khi tôi trả lời một câu hỏi khác, và tôi nhận ra không có câu hỏi nào về việc này. Theo hướng dẫn (SO có nghĩa là cho tất cả các cấp của người dùng và trả lời các câu hỏi của riêng bạn), tôi nghĩ rằng tôi muốn đưa nó lên. Rõ ràng, _I_ biết làm thế nào để làm điều đó, nhưng tôi sẽ không rep-con điếm, thay vào đó cho phép người khác trả lời (trừ khi họ không trong một người đi cùng của ngày trong trường hợp đó, tôi sẽ rep-whore đến tối đa :-) – paxdiablo