ファイルを監視したい。そのため、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
など)が与えられると、以下のようには機能しません。grep
xargs
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