変数に連続ストリームを割り当て、変数を処理します。

変数に連続ストリームを割り当て、変数を処理します。

私が持っているカスタムログ用のアナライザを作成しようとしています。

私のログファイルにはミリ秒単位の期間タイムスタンプがあり、他のファイルからそのログファイルをフィルタリングし、しきい値タイムスタンプを超えるログが電子メールまたはIMを介して私に送信されるようにします。

現在、私はいくつかの異なるコマンドと一緒にパイプされたコマンドの出力をtail -f変数に割り当ててから、変数の値を処理しようとしています。しかし、単純なロギングでさえ成功しませんでしたecho

これは私が使用するスクリプトの最も単純な形式です。

log=$(tail -f $logFile | grep ms | rev | cut -c 3- | rev | awk '{ if($NF > $monitorTreshold) {  print $0 }  }')
for q in log; do
  echo "Query : $q"
done

ベストアンサー1

Kusalanandaが述べたように、パイプは絶対に出てこないので、$log価値がありません。

また、grepバッファリングされた出力が表示されないことがありますstdout

したがって、次のようにデータをシェルループに直接接続して、リアルタイムでデータを処理する必要があります。

tail -f $logFile | grep --line-buffered ms | rev | cut -c 3- | rev | awk '{ if($NF > $monitorTreshold) {  print $0 }  }' | while read q
do
  echo "Query : $q"
done

たとえば、シェルのbashthenループ内に設定された変数は、ループの外側には表示されません。それらはksh93設定されます。これらの変数を設定する必要がある場合は、bashコプロセッシングを検討することをお勧めします。

おすすめ記事