私が持っているカスタムログ用のアナライザを作成しようとしています。
私のログファイルにはミリ秒単位の期間タイムスタンプがあり、他のファイルからそのログファイルをフィルタリングし、しきい値タイムスタンプを超えるログが電子メールまたは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
たとえば、シェルのbash
thenループ内に設定された変数は、ループの外側には表示されません。それらはksh93
設定されます。これらの変数を設定する必要がある場合は、bash
コプロセッシングを検討することをお勧めします。