
たとえば、実行中のプロセスがあり、その実行中のプロセスからキャプチャしてtail -F watch.txt
標準stdout
出力の他のコマンドにパイプするにはどうすればよいですか?
以下は、実行中のプロセスの例です。
$ tail -F watch.txt
foo
bar
baz
stdout
各文字列をキャプチャして新しいファイルに書き込むか、別のコマンドを使用して各文字列を処理したいとします。たとえば、terminal-notifier
メッセージを受け入れる(macのみ)コマンドがありますterminal-notifier --message "$STDOUT_FROM_TAIL"
。
Unixにすでに存在することでこれは可能ですか?
答え1
プログラムを再起動できると仮定パイプに入れてからパイプすることができますが、xargs
いくつかの注意事項があります。
- 一度に1行ずつコマンドを実行しようとしています(-n 1)。
- 出力をパラメータ(-i)に入れようとしています。
tail
報告後すぐにメッセージを実行したい場合があるため、以下がtail
必要です。ラインバッファ。
インストールした項目に応じて、次のようになります。
stdbuf -o 0 tail -f FILE | xargs -i -n 1 terminal-notifier --message "{}"
unbuffer tail -f FILE | xargs " "
(ラインバッファリング)オプションをtailf
サポートするバージョンを見ました。-l
Perlを使ってシミュレーションすることもできますtail -f
。
シェルでxargs
特別に作成されたループに置き換えることができます(かなり標準的で普遍的ですが)。for
いいえシンプルに見えますが、スペースを含むファイル名の処理流通中)。
プログラムを再起動できない場合は、stdoutを傍受する必要があります。これはスタックオーバーフロー回答それについて。その他のユーティリティとスクリプトリダイレクト説明されているここ;MacOSとの互換性についてはよくわかりません。
追加の修正
出力は、sedやcutなどのユーティリティを使用して正常に解析できます。
unbuffer tail -fファイル| grep動物| sed -e 's/animal(.*) gear/\1/' |
このように我々は:
Output by tail output by grep output by sed
correct horse battery staple
animal rhino gear animal rhino gear rhino
llama is animal llama is animal llama is animal
llama peruvian
animal ant gearbox animal ant gearbox antbox
(オプション使用可能--line-buffered
)grep