Sed
使用 awk 或其他 unix 實用程序在日誌文件上移動平均值?
場景:
我有一個日誌文件,其中包含一些條目“類”,如下所示:
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
(有沒有辦法讓 tail -F 發出嗶嗶聲?)**我的問題是:**有沒有辦法計算“R1 行數與 R0 行數”的滑動(移動)比率來給你一個例子?除了列印這個比率之外,我還需要能夠將它傳遞給其他一些工具,比如 gnuplot 來繪製它(儘管這可能有點牽強)。
顯然,這是在 Python 或 MATLAB 或 Octave 中做的一件相當微不足道的事情,但我非常渴望學習在 shell 中做這件事,我認為棘手的部分是將值傳遞給繪圖實用程序以更新繪圖。
讓 tail -F 對每一行發出一次嗶嗶聲:
bel=`echo foo | tr -c -s '\007' '\007'` tail -F file | sed "s/\$/$bel/"
至於使用 shell 計算移動平均值,這裡有一個 bash 腳本,它跟踪大小為 $windowsize 的移動視窗內的 R0 和 R1 行數。跟踪變數是 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"
。