2009-02-23 12 views
6

Yo tenía la impresión de sed no estaba bloqueando, porque cuando yo digo:¿Está sed blocking?

iostat | sed 

sed procesa los datos a medida que llega, pero cuando lo hago

iostat | sed | netcat 

Entonces sednetcat bloques.

¿Estoy en lo cierto?

Respuesta

14

sed funcionará en modo de búfer cuando no se imprime en un terminal. Esto significa que intentará llenar su búfer interno antes de realizar cualquier procesamiento y salida de manera predeterminada.

Esto se hace para aumentar el rendimiento, porque normalmente en una tubería no le importa el tiempo, pero quiere que se procesen tantos datos en un tiempo determinado como sea posible.

Pasar -u a sed le dirá que funcione sin búfer, por lo tanto, funciona de la misma manera que funciona cuando la salida va a un terminal.

+0

sed: opción ilegal - u – CommaToast

+0

@CommaToast: entonces o bien utilizar sed de GNU o averiguar si su sabor de sed tiene una opción equivalente (y que lo ponga aquí como una respuesta, cuando lo haga). –

+0

En mi comp de MacOSX, '-u' no se encuentra, pero' -l' funciona para el almacenamiento de líneas, lo cual es preferible. – Umbrella

1

No sé si entiendo la pregunta correcta, pero en su ejemplo, debería ser así:

  • espera de sed para iostat para enviar datos
  • iostat esperarán sed de proceso los datos si Sed es lenta
  • espera netcat para la sed para enviar datos
  • SED esperar a netcat de nuevo, si es lenta

Aparte de eso, sed no debería necesitar leer toda su entrada para producir resultados.

¿Observa algún retraso que no se pueda explicar por esto y por un pequeño almacenamiento en búfer?

3

Además de lo que dice @saua, sed está al menos orientado a la línea, que lee una línea y luego opera en él de modo que siempre almacenará en búfer al menos una línea. Además, sed puede funcionar en modo multilínea. Si está utilizando un patrón de líneas múltiples, entonces sed no puede dar salida a su memoria intermedia actual hasta que sepa que el patrón no se aplica o el patrón se ha procesado.

0

stdbuf puede ayudar a cambiar el comportamiento de almacenamiento en búfer de las corrientes estándar de io. Puede probar esto para cambiar el comportamiento de amortiguación:

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