2010-01-29 82 views
0

的區別我有一個文本文件,並在最後2行看起來是這樣......計算從平面文件

Uptime: 822832 Threads: 32 Questions: 13591705 Slow queries: 722 Opens: 81551 Flush tables: 59 Open tables: 64 Queries per second avg: 16.518 
Uptime: 822893 Threads: 31 Questions: 13592768 Slow queries: 732 Opens: 81551 Flush tables: 59 Open tables: 64 Queries per second avg: 16.618 

如何找到每個參數的兩個值之間的差異? 預期的輸出是:

61 -1 1063 10 0 0 0 0.1 

換句話說,我會想從早期的正常運行時間扣除當前運行時間值。 找到線程和問題等的區別。

本練習的目的是觀察此文件並在差異過高時提醒用戶。對於例如如果慢查詢超過500或「問題」參數過低(< 100)

(這是MySQL的狀態,但有沒有關係,所以MySQL的標籤不適用)

回答

0

這是一種方法。 tail用於獲取最後2行,如果你有一個大文件,在效率方面尤其有用。

tail -2 file | awk ' 
{ 
gsub(/[a-zA-Z: ]+/," ") 
m=split($0,a," ") 
if (f) { 
    for (i=1;i<=m;i++){ 
     print -(b[i]-a[i]) 
    } 
    # to check for Questions, slow queries etc 
    if ( -(b[3]-a[3]) < 100){ 
     print "Questions parameter too low" 
    }else if (-(b[4]-a[4]) > 500){ 
     print "Slow queries more than 500" 
    }else if (a[1] - b[1] < 0){ 
     print "mysql ...... " 
    } 
    exit 
} 
for(i=1;i<=m;i++){ b[i]=a[i] ;f=1 } 
} ' 

輸出

$ ./shell.sh 
61 
-1 
1063 
10 
0 
0 
0 
0.1 
+0

我會想增加一個,如果/其他。如果正常運行時間小於先前的時間,則顯示消息「mysql service restarted」。我不能在if子句中使用「curl」。 – shantanuo 2010-01-29 11:00:25

+0

如果正常運行時間小於前一次,則該值將小於0.請參閱更新後的代碼。 (注意:下次試試吧)。如有疑問,請閱讀awk文檔。 – ghostdog74 2010-01-29 11:25:01

+0

我設法使用Ramashalanka建議的方法獲取值。謝謝大家。 – shantanuo 2010-01-29 12:21:51

0

GAWK:

BEGIN { 
    arr[1] = "0" 
} 
length(arr) > 1 { 
    print $2-arr[1], $4-arr[2], $6-arr[3], $9-arr[4], $11-arr[5], $14-arr[6], $17-arr[7], $22-arr[8] 
} 
{ 
    arr[1] = $2 
    arr[2] = $4 
    arr[3] = $6 
    arr[4] = $9 
    arr[5] = $11 
    arr[6] = $14 
    arr[7] = $17 
    arr[8] = $22 
} 
1

剛上ghostdog74的(原來的)答案略有變化:

tail -2 file | awk ' { 
    gsub(/[a-zA-Z: ]+/," ") 
    m=split($0,a," "); 
    for (i=1;i<=m;i++) 
    if (NR==1) b[i]=a[i]; else print a[i] - b[i] 
} '