2009-02-23 30 views
6

Tôi có cảm giác sed không được ngăn chặn, bởi vì khi tôi nói:Có phải ngăn chặn sed không?

iostat | sed 

sed quá trình dữ liệu khi nó đến, nhưng khi tôi làm

iostat | sed | netcat 

Sau đó sed khối netcat.

Tôi có đúng không?

Trả lời

14

sed sẽ hoạt động ở chế độ đệm khi không in tới thiết bị đầu cuối. Điều này có nghĩa là nó sẽ cố gắng lấp đầy bộ đệm bên trong của nó trước khi thực hiện bất kỳ quá trình xử lý và đầu ra nào theo mặc định.

Điều này được thực hiện để tăng thông lượng, vì thông thường trong một đường ống bạn không quan tâm đến thời gian, nhưng muốn càng nhiều dữ liệu được xử lý trong một thời gian nhất định càng tốt.

Chuyển -u tới sed sẽ yêu cầu nó hoạt động không bị chặn, do đó làm việc giống như cách nó hoạt động khi đầu ra đi tới thiết bị đầu cuối.

+0

sed: Tùy chọn bất hợp pháp - u – CommaToast

+0

@CommaToast: sau đó, hoặc sử dụng GNU sed hoặc tìm hiểu xem hương vị của bạn sed có một tùy chọn tương đương (và đăng nó ở đây như một câu trả lời, khi bạn làm). –

+0

Trên bản MacOSX comp của tôi, '-u' bị thiếu, nhưng' -l' hoạt động cho việc đệm đường, được ưu tiên. – Umbrella

1

Tôi không biết nếu tôi hiểu câu hỏi đúng, nhưng trong ví dụ của bạn, nó phải là như thế này:

  • chờ đợi sed cho iostat để gửi dữ liệu
  • iostat sẽ đợi sed để quá trình dữ liệu nếu sed là chậm
  • netcat đợi sed để gửi dữ liệu
  • sed sẽ đợi cho netcat một lần nữa, nếu nó là chậm

Khác với điều đó, sed không cần phải đọc tất cả đầu vào của nó để tạo ra đầu ra.

Bạn có nhận thấy bất kỳ sự chậm trễ nào không thể giải thích được và một số đệm nhỏ không?

3

Ngoài những gì @saua nói, sed ít nhất là dòng định hướng, rằng nó đọc một dòng, sau đó hoạt động trên nó để nó sẽ luôn luôn được đệm ít nhất một dòng. Ngoài ra, sed có thể hoạt động ở chế độ nhiều dòng. Nếu bạn đang sử dụng mẫu nhiều dòng, thì sed không thể xuất bộ đệm hiện tại của nó cho đến khi nó biết rằng mẫu không áp dụng hoặc mẫu đã được xử lý.

0

stdbuf có thể hỗ trợ thay đổi hành vi lưu đệm của luồng io chuẩn. Bạn có thể thử này để thay đổi hành vi đệm:

... | stdbuf -oL -eL sed -e ... | ... 
Các vấn đề liên quan