Đường ống từ grep đến awk không hoạt động


34

Tôi đang cố gắng để tiếp greptục tailnhật ký tập tin và nhận được ntừ thứ từ một dòng. Tệp ví dụ:

$ cat > test.txt <<EOL
Beam goes blah
John goes hey
Beam goes what?
John goes forget it
Beam goes okay
Beam goes bye
EOL
^C

Bây giờ nếu tôi làm một tail:

$ tail -f test.txt
Beam goes blah
John goes hey
Beam goes what?
John goes forget it
Beam goes okay
Beam goes bye
^C

Nếu tôi grepđó tail:

$ tail -f test.txt | grep Beam
Beam goes blah
Beam goes what?
Beam goes okay
Beam goes bye
^C

Nhưng nếu tôi awkrằng grep:

$ tail -f test.txt | grep Beam | awk '{print $3}'

Không có gì cho dù tôi chờ đợi bao lâu. Tôi nghi ngờ đó là một cái gì đó để làm với cách hoạt động của luồng.

Bất cứ ai có bất kỳ đầu mối?

Câu trả lời:


55

Nó có thể là bộ đệm đầu ra từ grep. bạn có thể vô hiệu hóa nó với grep --line-buffered.

Nhưng bạn không cần phải đầu ra từ grep vào awk. awk có thể tự thực hiện mô hình regrec phù hợp với tất cả.

tail -f test.txt | awk '/Beam/ {print $3}'


8

Sử dụng tail -f test.txt | awk '/Beam/{print $3}'công việc cho tôi. Cũng như sử dụng tail -f test.txt | grep --line-buffered Beam | awk '{print $3}'(gnu grep).

Vấn đề ở đây là nếu awknhận được từng dòng dữ liệu hoặc dưới dạng một khối dữ liệu lớn hơn. Phiên bản GNU của grep gửi đầu ra trong các khối lớn hơn vì nó hiệu quả hơn, nhưng awkcần phải đọc từng dòng một để xuất ra từng dòng một.

Đặt theo cách này: grepsẽ chỉ gửi dữ liệu khi bộ đệm được lấp đầy, awk đang chờ bộ đệm đó được điền, vì vậy nó không gửi gì cả.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.