キャプチャ内容に応じてGREP出力を別のテキストファイルにリダイレクトする

キャプチャ内容に応じてGREP出力を別のテキストファイルにリダイレクトする

キャプチャする必要がある2つのイベントを含むログファイルがあります。

各イベントは、ログファイルに次の形式で個別の専用行を生成します。

タイムスタンプ - PID - プロセス - イベントタイプ - イベントの詳細

それ以外は何も気にしないイベントの詳細私が受け取ると予想されるファイルの列とデータは次のとおりです。

例1: { "values":{ "SPEED":"7.0" } }

例2: { "values":{ "CADENCE":"41" } }

私は、ログファイルの内容に応じて、毎回ログファイルの最後の行だけを読み取るシェルスクリプトを作成しようとしました。イベントの詳細列、結果リダイレクトスピードまたは特定のテキストファイルのデータ(結果を言うとき)スピード/ケイデンスデータは「整数」を意味します。速度":"例えば表現)。

これまでは、結果を2つの異なるファイルにリダイレクトできますが、次のようになります。

  1. スクリプトが機能するようにするには、ログファイルを2回「テイル」する必要がありました。
  2. ...それで、2番目のファイルが最初のファイルと同じ速度で更新されないような気がします...何らかの理由でいくつかのファイルが欠落しているようです。イベントはスクリプトの順序によって異なります。

使ってみよう眠る私は機能を実行し、一度に複数の行を「末尾」にしてCADENCEの更新不足を軽減しようとしましたが、成功しませんでした。私は時々CADENCEイベントが恋しいです。

ログファイルの動作に関する注意:ログを見ると、3つのイベントが最も多く表示され、常に同じ発生シーケンス(CADENCE、SPEED、OTHER)で記録され、間欠的に4番目のイベントが表示されます。私は、欠落しているCADENCEイベントが「4番目の」イベントの出現とは何の関係もないことを明らかにしたかったのです。

現在実行中のスクリプトの概要バージョンは次のとおりです。

#!/bin/bash
while :
do
   tail -1 logfile.txt | grep -oP '(?<=SPEED":")[0-9]+' > spd.txt
   tail -1 logfile.txt | grep -oP '(?<=CADENCE":")[0-9]+' > cad.txt
done

======更新:========

完全なログ行と期待される出力は次のとおりです。

行1の例:

入力(logfile.txtから):

03-16 21:05:28.641 2797-2842/process:Service D/WEBSOCKET: 受信: { "values":{ "Speed MPH":"3.1", "Speed KPH":"4.9 ", "マイル":" 0.551", "km":"0.886" } }

出力(spd.txtに送信):

4.9

例示行2:

入力(logfile.txtから):

03-16 21:05:29.309 2797-2842/process:Service D/WEBSOCKET: 受信: { "values":{ "RPM":"27" } }

出力:(cad.txtに送信):

27

答え1

ここではwhileループは必要ありません。

tail -f logfile.txt | awk '/SPEED/{print >"spd.txt"}/CADENCE/{print >"cad.txt"}'

答え2

わかりました、Kamaraj、助けてくれてありがとう!正しい答えを見つけるための鍵は次のとおりです。

これは私に合ったスクリプトです。

Tail-1ログファイル。txt | awk -F"\":\"" '{for (c=1;c<=NF;c++) {if ($c ~ /Speed KPH/) {print $( c+ 1)+0 > "spd.txt"} {if ($c ~ /RPM/) {print $(c+1)+0 > "cad.txt"}}}}'

帰らなければならないテール-1なぜならテール-fバッファリングの影響を受けて、キャプチャされたすべての値を含むtxtファイルにも記録が残ります。最新の結果を含む出力テキストファイルから1行だけが予想されます。

ありがとうございます。

関連情報