個々の部品は機能しますが、それらを通してデータをパイプ処理すると壊れます


2

一言で言えば、私はpingのための別の出力を作成しようとしています。それは私がやろうとしていることのためにもっとうまくいきます。そのために、私はpingの出力をsedにパイプ処理し、ミリ秒を除くすべてを削除します。最後の部分はPythonで書かれていて、それは出力を作成します。 これがコードです:

ping google.com | sed '/^[^=]*$/d;s/^[^=]*=[^=]*=[^=]*=//;s/ ms//' | python3 -c 'while True:
    l = [float(input()) for _ in range(10)]
    m = sum(l) / len(l)
    n = sum(abs(i - m) for i in l) / len(l)
    print("{}\t{}".format(m, n))'

フィッシュアンドバッシュで実行しようとしましたが、うまくいきません(=>出力が得られません)。しかし、個々の部品は機能します ping google.com | sed '/^[^=]*$/d;s/^[^=]*=[^=]*=[^=]*=//;s/ ms//' 期待される出力が得られます。私がcatを使ってファイルをそれにパイプすると、Pythonスクリプトは期待される出力を生成します。


@ John1024タブを挟んで平均と平均偏差を出力します。しかし、それは問題ではありません。 cmd1 | cmd2 > f に続く cat f | cmd3 と同等であるべきです cmd1 | cmd2 | cmd3。 (出力間の遅延があります)しかし、この場合はそうではありません、何らかの理由で私は知りません。
CodenameLambda

@ John1024出力がありません。質問を更新します。
CodenameLambda

回答:


3

このような動作が見られる場合(出力がない、または遅延している場合)は、通常どおり、パイプラインバッファリングが原因です。あなたが命令すればあなたの命令はここで働きます sed 「バッファなし」になる -u フラグ

個々のプログラムのバッファリングの振る舞いを変更することができます。 stdbuf からプログラム coreutils例えば、ラインバッファリングを使用するには:

stdbuf -oL sed '...'

ところで、あなたのバージョンが grep Perlの正規表現をサポートしているので、先読みパターンで同じ効果を得ることができます。例えば:

grep --line-buffered -oP '[0-9.]+(?= ms)'

私は特に好きです grep あなたが提供したオプション、しかし私はPerlの正規表現をサポートしていません。あなたはまだ使用することができます grep しかし: grep --line-buffered -oE '[0-9.]+ ms' | grep --line-buffered -oE '[0-9.]+'しかし、 sed 一度だけの呼び出しです。
CodenameLambda
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.