Tại sao grep không hoạt động với chuyển hướng?


15

Sử dụng toplệnh với chuyển hướng hoạt động tốt:

top > top.log

Bây giờ tôi muốn sử dụng grep để lọc một dòng nhất định:

top | grep "my_program" > top.log

Nhưng tệp nhật ký sẽ vẫn trống. Nhưng grep cung cấp một đầu ra khi sử dụng

top | grep "my_program"

Trường hợp my_programphải được thay thế bởi một chương trình đang chạy để xem một số đầu ra.

Tại sao cách tiếp cận của tôi không hiệu quả? Và làm thế nào tôi có thể sửa chữa nó?

bash  grep 

2
Tôi chỉ thử nó, và nó làm việc cho tôi. Tuy nhiên, có lẽ bạn nên xem -btùy chọn tophoặc sử dụng psthay thế.
Lev Levitsky

-bđã không giải quyết vấn đề của tôi, nhưng đã giải quyết một số vấn đề mã hóa. Cảm ơn bạn.

Câu trả lời:


22

Tôi nhận được cùng một hành vi mà bạn mô tả. Trên Ubuntu 11.10

top | grep "my_program" > top.log

không sản xuất bất kỳ đầu ra.

Tôi tin rằng lý do cho điều này là grep đang đệm đầu ra của nó. Để yêu cầu GNU grep nhổ từng dòng đầu ra, sử dụng --line-bufferedtùy chọn:

top | grep --line-buffered "my_program" > top.log

Xem thêm câu hỏi SO này cho các giải pháp tiềm năng khác.


3
+1 --line-bufferedgiải quyết vấn đề.

Cảm ơn bạn, điều này cũng giải quyết vấn đề cho tôi. Các -btùy chọn vẫn là một lời khuyên tốt từ Lev Levitsky, quá. Điều đó đã giải quyết một số vấn đề mã hóa với tệp nhật ký.

2

bạn nên sử dụng:

top -n 1 | grep "blah" > top.log

"-n 1" chạy trên cùng cho một lần lặp và sau đó thoát ra thay vì liên tục cập nhật cứ sau vài giây

vì bạn chỉ đang tìm kiếm một dòng mặc dù ps sẽ là một công cụ tốt hơn để sử dụng.


1

Cách giải quyết của tôi cho vấn đề này là:

while :;do top -b -n 1 | grep "my_program" >> top.log;done &

Bằng cách này, tôi có thể có một màn hình đang chạy trong nền cho my_program và giữ tất cả các kết quả trong tệp top.log.



0

Mặc dù cả hai đều phù hợp với tôi, tôi nghĩ lời khuyên của Lev Levitsky là chính xác. Sử dụng -bđối số.

Có một cơ hội tốt rằng chuyển hướng đầu ra là vấn đề và bạn không nhận được gì qua thiết bị xuất chuẩn, vì vậy hãy thử điều này thay vào đó:

top -b 2>&1 | grep "my_program" > top.log

Xin lưu ý rằng bạn có thể gặp vấn đề với bộ đệm đầu ra. Shell của bạn sẽ không liên tục ghi vào tệp để có thể mất một lúc top.logđể điền vào.

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.