Let's Go!

shell脚本及命令使用小结及Informix监控脚本

上一篇 / 下一篇  2010-12-24 17:05:56 / 个人分类:测试工具

 

要求监控informix数据库,一开始是用java分析所有的onstat结果数据,因为起初不了解怎么做好,慢慢有了思路,就转为全部用shell实现。

 

shell脚本及命令使用小结


1. awk的使用:

$ awk -F":" '{ print "username: " $1 "\t\tuid:" $3 }' /etc/passwd

说明:-F":"指定分隔符,为冒号,awk默认的分隔符是一个空格,"username: ","\t\tuid:",自定义,添加的字符串,


将awk取的值赋予变量:

 # echo aa bb cc | awk '{ print $3; }'
 cc
 # var=$(echo aa bb cc | awk '{ print $3; }')
 #echo $var
 cc
======================================================================================================

2. sed 的使用

sed -n '2p' file 
说明:输出第二行
onstat -p | sed -n '6p' | awk '{print $4 $8 }' 
说明:先用sed过滤行,然后用awk过滤自己指定的列
onstat -p | sed -n '18,20p' > sed_result      
说明:输出第18到第20行


sed有查找、替换、删除等功能:

1) 部分行的输出与删除
  注意: SED本身不改变原文件内容, 删除仅指不输出该部分,重定向输出为文件时,与原文件比为删除
  sed -n '2,5p' file1 : 仅输出文件file1的2-5行
  sed -e '2,5d' file1 : 将文件file1的2-5行删除
  sed -e '/^#/d' file1 : 将文件file1的以#开头的行删除
  sed -ne '/HELLO/p' file1 : 仅输出file1中含HELLO的行
  sed -ne '/BEGIN/,/END/p' file1 : 仅输出file1中BEGIN与END间的部分
  首先,匹配含BEGIN的行作为块首, 然后向后以第一次匹配的含END的行为块尾,输出该块各行
  如果, 没有匹配到BEGIN,则不输出; 如果只匹配到BEGIN,则输出从该行到文件尾的各行
  在匹配到BEGIN的行后面,匹配到END的前面含有的BEGIN当作一般行,仍以第一个BEGIN为块首
  一个文件中, 可能有好几个这样匹配的区域块,都要输出

2) 替换操作
  sed -e 's/foo/bar/' file1 : 将file1中第一次出现的foo替换为bar
  sed -e 's/foo/bar/g' file1 : 将file1中所有的foo替换为bar
  sed -e '1,8s/foo/bar/g' file1 : 将file1的1-8行中所以的foo替换为bar
  sed -e '/^$/,/^END/s/foo/bar/g' file1
  首先匹配以空行为块首,END为行首的行为块尾的所有区域块,
  然后将在这些区域块中出现的foo替换为bar
  sed -e 's/<.*>//g' file1 : 将file1各行中,<>间的文字删除(最大)
  is what meant ===> meant
  sed -e 's/<[^>]*.//g' file1 : 将file1各行中,<>间的文字删除(最小)
  is what meant ===> is what meant
  注意: .*表示任意格式的任意字符 [^>]*表示任意个数的非>的字符
  sed -e 's/girl/nice & hello/g' file1 : 将file1各行中的girl替换为nice girl hello
  这里&表示前面匹配的内容,在要替换的文字里引用
  更强的引用: 在匹配文字中用\(\)包含文字,在匹配文字中用\1到\9来引用
  sed -e 's/\(boy\) loves \(girl\)/\2 A loves \1 B/g' file1
  boy loves girl ===> girl A loves boy B'

3)对同一对象执行多个sed操作时的3种方法
  1). sed -e 'command1;command2;command3' file1
  三个sed命令依次作用到file1的各行
  2). sed -e 'command1' -e 'command2 file1
  跟1)类似,比1)跟保险,1)不能用的时候可以尝试
  3). sed -f script_file file1
  一些复杂命令,必须写到一个script. 文件中

======================================================================================================


3.  while读文件: shell按行读取文件

    变量的递增: let num=num+1   或者  let num+=1 或者  cs=`expr $cs + 1`


    #范例1:简单结构
  onstat -p > status
  while read line
  do
   echo $line
  done < status

    #范例2:
    top > status
  num=1
  while read line
  do    
  if [ $num -eq  6 ];
  then
  #echo $num
  #echo $line
  fi  
  let num=num+1
  done < status 
======================================================================================================


4. until 循环;  以及读取命令行参数,  $#有特殊含义,获取了传入的参数的个数,类似的特殊标识还有几个。
  
  if [ $# -ne 3 ]
   then
    echo "Usage: 脚本名称 参数1 参数2 参数3, 参数1是循环次数,参数2是循环间隔时间,参数3是输出结果文件"
     exit 1
    fi  

   cs=1
   until [ $cs -gt $1 ]
   do
     cs=`expr $cs + 1`
     sleep $2
   done  

======================================================================================================

5. 整数比较:
-lt               Less than
-gt               Greater than
-le               Less than or equal to
-ge               Greater than or equal to
-eq               Equal to
-ne              Not equal to

======================================================================================================

6. shell的if语句格式:


  if [ $num -eq  6 ];
  then
  #echo $num
  fi
======================================================================================================

7. cut 的使用,也可以对一行的数据进行指定截取。一般都可以指定分隔符号

cut -c 1-5,10-14 file
cut -f 1,3 file

我们经常会遇到需要取出分字段的文件的某些特定字段,例如 /etc/password就是通过":"分隔各个字段的。
可以通过cut命令来实现。例如,我们希望将系统账号名保存到特定的文件,就可以:
cut -d: -f 1 /etc/passwd > /tmp/users
-d用来定义分隔符,默认为tab键,-f表示需要取得哪个字段

What’s cut?
子曰:cut命令可以从一个文本文件或者文本流中提取文本列。
命令用法:
   cut -b list [-n] [file ...]
   cut -c list [file ...]
   cut -f list [-d delim][-s][file ...]
l    上面的-b、-c、-f分别表示字节、字符、字段(即byte、character、field);
l    list表示-b、-c、-f操作范围,-n常常表示具体数字;
l    file表示的自然是要操作的文本文件的名称;
l    delim(英文全写:delimiter)表示分隔符,默认情况下为TAB;
l    -s表示不包括那些不含分隔符的行(这样有利于去掉注释和标题)
上面三种方式中,表示从指定的范围中提取字节(-b)、或字符(-c)、或字段(-f)。


-c 和 -f 参数可以跟以下子参数:
m 第m个字符或字段
m- 从第m个字符或字段到文件结束
m-n 从第m个到第n个字符或字段
-n 从第1个到第n个字符或字段

======================================================================================================

 

 

 

 

 

监控脚本原文:

 


if [ $# -ne 3 ]
 then
  echo "Usage: 脚本名称 参数1 参数2 参数3, 参数1是循环次数,参数2是循环间隔时间,参数3是输出结果文件"
   exit 1
   fi  
  
   echo "Time,%cached read,ovlock,%ovbuff,bufwaits,lokwaits,lockreqs,deadlks,ckpwaits,seqscans,Fg Writes,Chunk Writes,Physical Logging pages/io,Physical Logging %used,Logical Logging pages/io,Logical Logging %used,active,total,hash buckets,lock table overflows"  >> informixStatus_$3.csv
  
   cs=1
   until [ $cs -gt $1 ]
   do

  var0=$(date | awk '{print $4}')
    
    onstat -p > status
  num=1
  while read line
  do   
  if [ $num -eq  6 ];
  then
  var1=$(echo $line | awk '{print $4 }' )
  fi 
  if [ $num -eq  15 ];
  then
  var2=$(echo $line | awk '{print $1 }' )
  var3=$(echo $line | awk '{print $3 }' )
  fi  
  if [ $num -eq  18 ];
  then
  var4=$(echo $line | awk '{print   $1 }' ) 
  var5=$(echo $line | awk '{print   $2 }'  ) 
  var6=$(echo $line | awk '{print  $3 }'  ) 
  var7=$(echo $line | awk '{print   $4 }'   ) 
  var8=$(echo $line | awk '{print   $6 }'  )  
  var9=$(echo $line | awk '{print   $8 }'  ) 
  fi 
  let num=num+1
  done < status 
 
 
    onstat -F > status
  num=1
  while read line
  do    
  if [ $num -eq  6 ];
  then
  var10=$(echo $line | awk '{print $1 }'  )
  var11=$(echo $line | awk '{print  $3 }'  )
  fi  
  let num=num+1
  done < status 

   
   
    onstat -l > status
  num=1
  while read line
  do  
  if [ $num -eq  6 ];
  then
  var12=$(echo $line | awk '{print $6 }' )
  fi  
  if [ $num -eq  8 ];
  then
  var13=$(echo $line | awk '{print  $5 }' )
  fi  
  if [ $num -eq  12 ];
  then
  var14=$(echo $line | awk '{print $8 }' )
  fi  
  if [ $num -eq  14 ];
  then
  var15=$(echo $line | awk '{print  $4 }' )
  fi      
  let num=num+1
  done < status 

   

    onstat -k | grep active > status
  num=1
  while read line
  do    
  if [ $num -eq  1 ];
  then
  var16=$(echo $line | awk '{print  $1 }')
  var17=$(echo $line | awk '{print $3 }' )
  var18=$(echo $line | awk '{print  $5 }' )
  var19=$(echo $line | awk '{print  $8 }')
  fi    
  let num=num+1
  done < status 

    echo "$var0,$var1,$var2,$var3,$var4,$var5,$var6,$var7,$var8,$var9,$var10,$var11,$var12,$var13,$var14,$var15,$var16,$var17,$var18,$var19" >> informixStatus_$3.csv

    cs=`expr $cs + 1`
    sleep $2
   done  
   rm status

 

Informix监控脚本说明:
1)监控脚本名称:monitorInfx
2)监控脚本用法:monitorInfx 循环次数 循环间隔时间 结果文档名
3)监控结果命名:informixStatus_输入的结果文档名(年月日_测试类型_用户数_运行时间_开始时间)

4)脚本执行范例:
nohup sh monitorInfx 600 3 20101245_HunHe_30Vuser_30Min_1401 &

5)脚本执行结束后,会在当前目录下生成如下文件:
informixStatus_20101245_HunHe_30Vuser_30Min_1401.csv

6)可以将此文件另存为excel文件,然后生成图表

7)注意输入的结果文档名中不要包含路径


 

 

 

informix监控及shell脚本.rar(404 KB)

 

 

 

 


TAG:

 

评分:0

我来说两句

Open Toolbar