计算与平面文件的差异

时间:2010-01-29 08:37:20

标签: awk

我有一个文本文件,最后两行看起来像这样......

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或“Questions”参数太低(<100)

(这是MySQL的状态,但与它无关,所以mysql标签不适用)

3 个答案:

答案 0 :(得分: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]
} '

答案 1 :(得分:0)

这是一种方式。 tail用于获取最后两行,如果你有一个大文件,在效率方面特别有用。

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

答案 2 :(得分: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
}