tail -fからawk、jqまでのログファイルを処理する方法は?

tail -fからawk、jqまでのログファイルを処理する方法は?

私のユースケースは次のとおりです。 PHPでjsonデータのみを記録するApacheログファイルがあります。 Apacheがログを印刷する方法のため、awkを使用して各行の開始と終了を切り捨てる必要があります。結果はjson文字列で、jqを使用してきれいに印刷したいと思います。

tailからawkにパイプするにはstdbufを使用する必要があります。私が思いついた完全なコマンドは次のとおりです。

stdbuf -o0 tail -f  -n 1 /var/log/apache2/error.log | awk '{print substr($0,83, length($0)- 166); }' | jq 

これはうまくいきません。私はそれがjqのためだと思いますが、--streamまたは--unbufferedも動作しません。

私がやりたいことをする方法を知っている人はいますか?

編集する: JSONの例は次のとおりです。

{"foo": "bar"}

これは正しく表示されますが、tailの実行中にjsonが作成されても表示されません。

ベストアンサー1

私は解決策を見つけました。 stdbuf -oOを使用して各コマンドを「バッファ解除」する必要があります。したがって、次のようにする必要があります。

stdbuf -o0 tail -f  -n 2 /var/log/apache2/error.log | stdbuf -o0 awk '{print substr($0,83, length($0)- 166); }' | jq

おすすめ記事