パイプラインの中央にあるAWKは出力を返しません。

パイプラインの中央にあるAWKは出力を返しません。

Apacheのすべての変更のログファイルを処理し、単純なオネライナを作成したいと思います。

inotifywait --format="%w%f" -rm /var/log/apache2/ | gawk '{ print }'

これが私が始めたところです。しかし、出力をさらにパイプすると出力は出ません。

inotifywait --format="%w%f" -rm /var/log/apache2/ | gawk '{ print }' | wc -l

とにかく、「ls」、「tail」(私が本当に欲しいもの)を使用すると、出力はまったくありません(他のコンソールで最初の文を実行すると変更があることがわかります)。 stdbuf、fflush()を追加しようとしましたが、何も機能しませんでした。この質問を理解していません!このオンラインユーザーを文字列ポイントとして使用できるスクリプトに保存したいと思います。それ以外の場合はxargsを使用できますが、望ましくありません。どんな助けやアドバイスでもいいでしょう!

答え1

出力が得られない理由は、wc -lすべての出力が消費されるためです。teeプロセス置換と一緒にawk出力をコンソールに印刷し、次の方法で読み取ることができますwc

inotifywait --format="%w%f" -rm /var/log/apache2/ | gawk '{ print }' | tee >(wc -l)

inotifywaitコマンドは終了しませんが、wc -lすべてのデータが読み込まれるまで(この場合はパイプが閉じられたとき)、出力が印刷されないため、まだいくつかの問題があります。以下から直接計算できますawk

inotifywait --format="%w%f" -rm /var/log/apache2/ | gawk 'BEGIN { total=0 } { print; total++; print total } END { print "final total: " total }'

関連情報