tags:

views:

47

answers:

3

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)

A: 

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
ghostdog74
I will like to add one more if /else. If the uptime is less than the earlier one then show the message "mysql service restarted". I could not use "curl" in the if clause.
shantanuo
if the uptime is less than earlier one, the the value will be less than 0. see the updated code. (NB:give it a shot yourself next time). In doubt, read up the awk docs.
ghostdog74
I managed to get the values using the method suggested by Ramashalanka. Thanks all.
shantanuo
A: 

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
}
Ignacio Vazquez-Abrams
+1  A: 

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