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:
标题搜索
日历
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
1 | 2 | 3 | 4 | 5 | 6 | ||||
7 | 8 | 9 | 10 | 11 | 12 | 13 | |||
14 | 15 | 16 | 17 | 18 | 19 | 20 | |||
21 | 22 | 23 | 24 | 25 | 26 | 27 | |||
28 | 29 | 30 |
我的存档
数据统计
- 访问量: 713212
- 日志数: 415
- 图片数: 1
- 文件数: 3
- 建立时间: 2008-12-07
- 更新时间: 2015-07-14