追加の修正

追加の修正

たとえば、実行中のプロセスがあり、その実行中のプロセスからキャプチャして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-bufferedgrep

おすすめ記事