2017-08-09 10 views
0

パイプラインから読み取っているプログラムから連続的に更新された出力を取得するにはどうすればよいですか?たとえば、のは、このプログラムはwcのバージョンだったとしましょう:パイプラインから読み取ったプログラムから連続的に更新された(実行回数)出力

$ ls | running_wc 

だから私は、例えば、瞬時に出力にこれをみたいです

0 0 0 

新しい出力行が受信されるたびに、再び更新されます。私のコマンドは本当にlsではありませんもちろん

1 2 12 
2 4 24 
etc. 

は、それは私が実際に動的にそれが一致し、非マッチをカウントし、単一でこの情報を要約しているのが大好きです...ゆっくりとデータを出力プロセスです

$ my_process | count_matches error 

これは、一致する一致と一致しないカウントで1行の出力を常に更新します。

$ my_process | count_matches error 
0 5 

その後、2つの一致と10の一致しない行が見つかりました。

$ my_process | count_matches error 
2 10 
+0

は(タイトルに)明示的に*本物*ご質問についてはお問い合わせ下さい。それは、 'ls |そのストローマンは、 'wc'をそのまま使用する必要があることを意味しています(新しいロジックで別のコマンドに置き換えることはできません)。 –

+0

@CharlesDuffy - はい、私は持っていましたが、私が言ったこと以外には、質問でそれを理解する明確な方法を考えることができませんでした。確かに近似で、私が望んでいたものと正確に同じではありませんが、同じ球場にあります。 –

+0

...私はここに、ディレクトリエントリが追加されるのを待つ方法について話し合う答えがある(または追加できる)ポーリングなしで削除する、f/e;なぜlsを信用しない方が良いか? wc'は最初の正確なファイル数になります。 –

答えて

3

ddそれはSIGUSR1信号を受信した場合の統計情報をプリントアウトし、どちらもwcgrepはそれを行います。多かれ少なかれ、それらを再実装する必要があります。

count_matches() { 
    local pattern=$1 
    local matches=0 nonmatches=0 
    local line 

    while IFS= read -r line; do 
     if [[ $line == *$pattern* ]]; then ((++matches)); else ((++nonmatches)); fi 
     printf '\r%s %s' "$matches" "$nonmatches" 
    done 

    printf '\n' 
} 

キャリッジリターン\rを印刷するたびには、互いを上書きするプリントアウトを引き起こします。

ほとんどのプログラムは、パイプラインで使用すると、ラインバッファリングからフルバッファリングに切り替わります。実行速度の遅いプログラムは、結果がすぐに利用できるように、各行の後に出力をフラッシュする必要があります。あるいは、変更できない場合は、stdbuf -oLを使用して、C stdioを使用するプログラムを強制的に行バッファstdoutにすることができます。

stdbuf -oL my_process | count_matches error 
1

awkの使用。まず、 "my_process" を作成します。

$ for i in {1..10} ; do echo $i ; sleep 1 ; done # slowly prints lines 

マッチカウンタ:それを実行

$ awk 'BEGIN {   
    print "match","miss" # print header 
    m=0     # reset match count 
} 
{ 
    if($1~/(3|6)/)   # match is a 3 or 6 (for this output) 
     m++    # increment match count 
    print m,NR-m   # for each record output match/miss counts 
}' 

$ for i in {1..10} ; do echo $i ; sleep 1 ; done | awk 'BEGIN{print "match","miss";m=0}{if($1~/(3|6)/)m++;print m,NR-m}' 
match miss 
0 1 
0 2 
1 2 
1 3 
1 4 
2 4 
2 5 
2 6 
2 7 
2 8 
関連する問題