2009-02-23 6 views
6

J'ai eu l'impression sed ne bloquait pas, parce que quand je dis:Est-ce que sed bloque?

iostat | sed 

sed traite les données qu'il arrive, mais quand je fais

iostat | sed | netcat 

Puis sed blocs netcat.

Ai-je raison?

Répondre

14

sed fonctionnera en mode tampon lorsqu'il n'imprime pas sur un terminal. Cela signifie qu'il va essayer de remplir son buffer interne avant d'effectuer tout traitement et de sortir par défaut. Ceci est fait pour augmenter le débit, car normalement dans un tuyau, vous ne vous souciez pas de la synchronisation, mais vous voulez que le plus de données possible soit traité dans un temps donné. En passant -u à sed lui dira de travailler sans tampon, fonctionnant de la même manière que cela fonctionne quand la sortie va à un terminal.

+0

sed: l'option illégale - u – CommaToast

+0

@CommaToast: alors soit utiliser GNU sed ou savoir si votre goût de Sed a une option équivalente (et l'afficher ici une réponse, quand vous faites). –

+0

Sur ma compilation MacOSX, '-u' est manquant, mais' -l' fonctionne pour la mise en mémoire tampon, ce qui est préférable. – Umbrella

1

Je ne sais pas si je comprends bien la question, mais dans votre exemple, il devrait ressembler à ceci:

  • attend sed pour iostat pour envoyer des données
  • iostat attendra sed processus les données si Sed est lente
  • attend netcat pour sed pour envoyer des données
  • sed attendra netcat à nouveau, si elle est lente

Autre que cela, sed ne devrait pas avoir besoin de lire toutes ses entrées pour produire une sortie.

Observez-vous des retards qui ne peuvent pas être expliqués par ceci et une petite mise en mémoire tampon?

3

En plus de ce que dit @saua, sed est au moins orienté ligne, qu'il lit une ligne, puis qu'il opère de telle sorte qu'il tamponne toujours au moins une ligne. En outre, sed peut fonctionner en mode multiligne. Si vous utilisez un motif multiligne, alors sed ne peut pas sortir son tampon courant jusqu'à ce qu'il sache que le motif ne s'applique pas ou que le motif a été traité.

0

stdbuf peut aider à modifier le comportement de mise en mémoire tampon des flux io standard. Vous pouvez essayer de changer le comportement de mise en mémoire tampon:

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