2016-07-21 15 views
0

無限ループ中に受信したデータをファイルに書き込む方法はありますか?私はWebページに表示されるように私の端末にWebコンテンツを表示するスクリプトを持っています。しかし、teeへのすべての私の試みは、空のファイルをもたらしました。これは、ループを終了することなく、ファイルに何かを書き込む機会がないためです。しかし、私は不要なデータでハードドライブを満たす無限ループについて読んでいます。したがって、コマンドパイプラインからの出力を書くことも可能であるはずです。これがすべてで動作する唯一の理由は、それが受信した後としてもラインの順序を維持しながら、重複行を削除入力を読み込み(私の説明が正確でないなら、私を修正)awk !x[$0]++コマンドであることを無限ループで受信したデータをファイルに書き込む方法

get_page() { 

    osascript -e \ 
    'tell application "Google_Chrome" to tell window 1 to tell active tab to execute javascript "document.body.innerText"' 

} 

while get_page | grep -E '[:alnum:]' 
do 
    sleep 1 & 
done < <(get_page) | awk '!x[$0]++' 

注意よくそれがなければ、このスクリプトは狂気になるでしょう。

答えて

0

いくつかのこと:

  1. ループは無限ではありません。 getpage関数がゼロ以外を返すまで反復処理を行います。

  2. ループを1秒に1回実行しますか?その場合はsleep 1の後に&を削除するか、それよりもはるかに高速に実行されます。 &は、sleepプロセスをバックグラウンドに置き、処理を続行します。

  3. あなたはgetpageを2度呼びます。これはおそらく意図しないものです。それはまだそれが解決しない場合は

    while true; do 
        getpage 
        sleep 1 
    done | awk '!seen[$0]++' | tee output.log 
    

コメントで指摘したように、それは、おそらくです:私の代わりに、次のような何かをしたいおそらくそれは返すかわからないんだけど、あなたバッファリングがawkによって行われたために、以下のようになります。各行の後にその出力バッファをフラッシュするawkを強制するには、あなたが

awk '!seen[$0]++ { print; fflush() }' 

を行うことができ、これに若干の問題がawkプロセスがメモリに入力の各ユニークなラインのコピーを保つことです。よりユニークな行がgetpageの出力から読み取られると、これは大きくなります。

+0

'uniq'のマニュアルページから*入力の繰り返し行が隣接していないと検出されないので、最初にファイルをソートする必要があるかもしれません*質問の中の' awk'コマンドは、注文を複製して保存します。それは私がたくさん使うものです。あなたのソリューションはデータを出力し、 'tee'コマンドも許可しますが、本当にユニークな行だけを出力するには' awk'が必要です。私が理解できないことは、あなたのソリューションを使用し、 'uniq'を' awk'に置き換えると、私の端末や出力ログにデータが出力されないことです。 –

+0

@ user556068あなたは 'uniq'について正しいです。朝早すぎました。ごめんなさい。 'getpage'はそれ自身で標準出力のデータを生成しますか? – Kusalananda

+0

はい、現在ブラウザに表示されているものは何でも生成します。そしてさらにテストすると、 'awk'はパイプラインの最後のコマンドである場合にのみデータを出力します。ですから出力ログに 'tee'してから' awk'を使いますが、これを行うと60秒で3MBの出力ログが生成されます。 –

関連する問題