2009-02-23 17 views
6

ho avuto l'impressione sed non è stato il blocco, perché quando io dico:Il blocco sed è?

iostat | sed 

sed elabora i dati man mano che arrivano, ma quando lo faccio

iostat | sed | netcat 

Poi sed blocchi netcat.

ho ragione?

risposta

14

sed funzionerà in modalità bufferizzata quando non viene stampato su un terminale. Ciò significa che proverà a riempire il suo buffer interno prima di eseguire qualsiasi elaborazione e output per impostazione predefinita.

Questo viene fatto per aumentare il throughput, perché normalmente in un tubo non ti interessa il tempo, ma vuoi quanti più dati elaborati in un dato momento il più possibile.

Passare a -u per sed dire che funziona senza buffer, quindi funziona nello stesso modo in cui funziona quando l'output viene inviato a un terminale.

+0

sed: opzione illegale - u – CommaToast

+0

@CommaToast: quindi utilizzare GNU sed o scoprire se il sapore di sed ha un'opzione equivalente (e post qui come una risposta, quando lo fai). –

+0

Sul mio comp MacOSX, '-u' manca, ma' -l' funziona per il buffering di linea, che è preferito. – Umbrella

1

Non so se ho capito la domanda giusta, ma nel tuo esempio, dovrebbe essere simile a questo:

  • attese sed per iostat per inviare i dati
  • iostat aspetterà per sed a processo i dati se sed è lenta
  • netcat attende sed per inviare i dati
  • sed aspetterà netcat di nuovo, se è lento

Oltre a questo, sed non dovrebbe avere bisogno di leggere tutto il suo input per produrre output.

Osservate ritardi che non possono essere spiegati da questo e da qualche piccolo buffering?

3

In aggiunta a ciò che @saua dice, sed è almeno orientato alla linea, che legge una linea, quindi opera su di esso in modo che sarà sempre il buffering di almeno una riga. Inoltre, sed può funzionare in modalità multilinea. Se si utilizza un modello multilinea, sed non può stampare il buffer corrente fino a quando non sa che il modello non si applica o il motivo è stato elaborato.

0

stdbuf può aiutare con la modifica del comportamento di buffer dei flussi io standard. Si può provare questo per modificare il comportamento di tamponamento:

... | stdbuf -oL -eL sed -e ... | ...