开发者

calculate the difference from flat file

开发者 https://www.devze.com 2022-12-18 16:06 出处:网络
I have a text file and the last 2 lines look like this... Uptime: 822832Threads: 32Questions: 13591705Slow queries: 722Opens: 81551Flush tables: 59Open tables: 64Queries per second avg: 16.518

I have a text file and the last 2 lines look like this...

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

How do I find the difference between the two values of each parameter? The expected output is:

61 -1 1063 10 0 0 0 0.1

In other words I will like to deduct the current uptime value from the earlier uptime. Find the difference between the threads and Questions and so on.

The purpose of this exercise is to watch this file and 开发者_运维百科alert the user when the difference is too high. For e.g. if the slow queries are more than 500 or the "Questions" parameter is too low (<100)

(It is the MySQL status but has nothing to do with it, so mysql tag does not apply)


Just a slight variation on ghostdog74's (original) answer:

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]
} '


here's one way. tail is used to get the last 2 lines, especially useful in terms of efficiency if you have a big file.

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 }
} '

output

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


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
}
0

精彩评论

暂无评论...
验证码 换一张
取 消