1

テキストソース(ログファイル)があり、サードパーティによって新しい行が追加されています。

を使用して、ソースファイルへの追加を出力できますtail -f source。次に、それをawkスクリプトにパイプしてawk -f parser.awk、出力を解析およびフォーマットできます。

私の質問は、実行中に、パイプを介してawkスクリプトの標準入力に何も入らずに、5秒以上経過するたびにスクリプト内tail -f source | awk -f parser.awkを呼び出す方法はありますか?function foo()parser.awk

編集:現在GNUAwk3.1.6を使用しています。必要に応じて、新しいバージョンにアップグレードできる場合があります。

4

2 に答える 2

1

あなたの質問に対する正確な答えではありません。ただし、シェルには、実際に必要なことを実行できる小さなハックがあります。

{ tail -f log.file >&2 |  { while : ; do sleep 5; echo SECRET_PHRASE ; done ; } ; } 2>&1 | awk -f script.awk

awkがSECRET_PHRASEを受信するとfoo、5秒ごとに関数を実行します。残念ながら、この間にテールから出力があった場合でも、5秒ごとに実行されます。

ps。'{}'を'()'に、またはその逆に置き換えることができます。最初のケースではサブシェルを作成せず、2番目のケースでは作成します。

もう1つの方法は、過去5秒間に誰も書き込みを行わなかった場合に備えて、この秘密のフレーズをログファイルに直接追加することです。ただし、ログファイルが台無しになるため、お勧めできません。

于 2012-07-25T14:33:26.413 に答える
1

シェルがreadサポートしている-t場合、これ-uは醜いハックです:

{ echo hello; sleep 6; echo world; } | awk 'BEGIN{ 
    while( "while read -t 5 -u 3 line; do echo \"$line\"; done" | getline > 0 )
        print
    }' 3<&0

printwhileループの本体にあるをスクリプトに置き換えることができます。ただし、パイプラインのtailとawkの間に読み取りタイムアウトを設定する方がはるかに理にかなっており、tailtotimeoutを再実装する方がさらに理にかなっています。

于 2012-07-25T14:53:07.980 に答える