grepの後、パイプコマンドは機能しません。

grepの後、パイプコマンドは機能しません。

ファイルを監視したい。そのため、1行に1つのスクリプトを実行するために、次のコマンドを使用してファイルを追跡しました。

tail -3f logfile.log | grep "action.*add" | sed -u -e "s/^/'/" -e "s/$/'/" | xargs -L 1 -P 5 bash testscript.sh

しかし、スクリプトが実行されていないようです。grep次のパイプには入力がないことがわかりました。

私が試したとき、

tail -3f logfile.log | grep "action.*add"

効率的。ただし、次のフィルタ(例:sedなど)が与えられると、以下のようには機能しません。grepxargs

tail -3f /var/tmp/rabbitmq-tracing/logfile.log | grep "action.*add" | grep add 

これが起こる理由とこの問題を克服する方法を理解するのに役立ちます。


編集1: デフォルトでは、次の作業が機能しなければなりませんでした。なぜ今はうまくいかないのか混乱しています。

tail -f file.txt | grep something | grep something | grep something

編集2: 最初のgrep以降の出力行は、以下のようにjson文字列になります。この行をbashスクリプトへの入力として使用したいと思います(一重引用符で囲みます)。

{"twNotif": {"originator": "api", "chain": "test", "txId": "08640-0050568a5514", "version": "1.0", "msgType": "api", "twData": {"api": {"hostId": "007bdcc5", "user": "test", "cmdTxt": "100599"}}, "action": "add", "store": "test", "msgTime": 1467280648.971042}}

ベストアンサー1

--line-bufferedスイッチの使用grep

tail -3f logfile.log | grep --line-buffered "action.*add" | sed -u -e "s/^/'/" -e "s/$/'/" | xargs -L 1 -P 5 bash testscript.sh

男のgrepから:

--line-buffered 出力にラインバッファリングを使用します。これによりパフォーマンスが低下する可能性があります。


またはあなたは使用することができますstdbuf もっと読む

stdbufを使用すると、プログラムに関連する3つの標準I / Oストリームのバッファリング操作を変更できます。要約:

次の構文を使用してください。

... | stdbuf -oL grep ... | ...

あなたの例:

tail -3f logfile.log | stdbuf -oL grep "action.*add" | sed -u -e "s/^/'/" -e "s/$/'/" | xargs -L 1 -P 5 bash testscript.sh

おすすめ記事