シナリオ:
次のようなエントリ「クラス」がいくつかあるログファイルがあります。
R0 dx=0.00500 rb=0.00000 sn=1 3145.88 2.59 0.08 se=21315 id=16190
R0 dx=0.00300 rb=-1.00000 sn=1 3150.40 2.38 0.05 se=21316 id=16191
R1 dx=-0.00500 rb=1.00000 sn=-1 3155.14 2.54 0.05 se=21317 id=16192
R1 dx=-0.02000 rb=-1.00000 sn=-1 3157.73 2.48 0.10 se=21318 id=16193
R0 dx=-0.02000 rb=0.00000 sn=-1 3160.59 2.74 0.08 se=21319 id=16194
R1 dx=0.00500 rb=1.00000 sn=1 3165.18 2.43 0.10 se=21320 id=16195
R0 dx=0.00100 rb=-1.00000 sn=1 3167.84 2.53 0.05 se=21321 id=16196
R3 dx=0.00100 rb=1.00000 sn=1 3170.11 0.10 0.10 se=21322 id=16197
このログファイルをtail -F
で監視しています( テール-Fビープ音を鳴らす方法はありますか? )
私の質問は: 例を挙げると、「R1ライン数とR0ライン数」のスライド(移動)比を計算する方法はありますか?この比率を印刷することに加えて、それをプロットするためにgnuplotのような他のツールに渡すことができる必要があります(これは少しストレッチかもしれませんが)。
明らかに、これはPythonまたはMATLABまたはOctaveで行うのはかなり簡単なことですが、シェルでそれを行うことを学びたいと思っています。トリッキーな部分は値をに渡すことだと思いますプロットを更新するためのプロットユーティリティ。
行ごとに1回テール-Fビープ音を鳴らします。
bel=`echo foo | tr -c -s '\007' '\007'`
tail -F file | sed "s/\$/$bel/"
シェルを使用して移動平均を計算する場合、サイズ$ windowsizeの移動ウィンドウ内のR0およびR1行の数を追跡するbashスクリプトを次に示します。追跡変数はr0sumとr1sumです。
windowsize=10
declare -ai isr0line isr1line r0sum r1sum i
for ((i=0; $i<$windowsize;i+=1)) ; do isr0line[$i]=0; isr1line[$i]=0; done
i=0
while read line
do
r0sum=$(($r0sum - ${isr0line[$i]}))
r1sum=$(($r1sum - ${isr1line[$i]}))
case "$line" in
R0*) isr0line[$i]=1; isr1line[$i]=0; ;;
R1*) isr1line[$i]=1; isr0line[$i]=0; ;;
*) isr0line[$i]=0; isr1line[$i]=0; ;;
esac
r0sum=$(($r0sum + ${isr0line[$i]}))
r1sum=$(($r1sum + ${isr1line[$i]}))
echo "R0 lines $r0sum R1 lines $r1sum"
i=$((($i + 1) % $windowsize))
done
これでログをフィルタリングします。
awk '/^R1/ { r1++ } ; /^R0/ { r0++ } ; r0 > 0 { print r1/r0 }'
これにより、最初のR0の後の各行の「実行率」が出力されます。
そして、これはスライディングレシオ用です(申し訳ありませんが、「レシオ」が何を意味するのか間違った考えがありました):
BEGIN { winsize=10; h=t=r0=r1=0 }
/^R0/ { r0++ }
/^R1/ { r1++ }
{ print r1 ":" r0 ; buf[h++] = $1 }
h - t >= winsize { r = buf[t]; delete buf[t++] }
r ~ /R1/ { r1-- }
r ~ /R0/ { r0-- }
変数winsize
はウィンドウサイズを保持します。ここでは正規表現は不要ですが、キーストロークを節約できます。テストは$1 == "R0"
とr == "R0"
であった可能性があります。