shell 脚本接口分析数据插入数据库
一、知识点:
1、awk输出单引号
[fesit@entrance0001 member]$ awk 'BEGIN {print "'\''"}'
'
2、shell字符串输出单引号 ''\' + "字符串" + ''\'
[fesit@entrance0001 member]$ echo ''\'"fe"''\' 'fe'
3、awk引用shell脚本中变量
需要加单引号才能解析
'$database' '$service_name' '$service_ip'
4、awk格式化输出,需要使用 printf
{ printf("total pay for %s is $%.2f\n", $1, $2 * $3) }
字符串包含两个 % 规格。第一个是 %s ,说明以字符串的方式打印第一个值 $1 。
第二个是 %.2f ,说明以数字的方式打印第二个值 $2*$3 ,并保留小数点后面两位
字符串尾部的 \n 代表开始新的一行,使得后续输出将从下一行开始
{ printf("%-8s $%6.2f\n", $1, $2 * $3) }
第一个规格 %-8s 将一个姓名以字符串形式在8个字符宽度的字段中左对齐输出
第二个规格 %6.2f 将以数字的形式,保留小数点后两位,在6个字符宽度的字段中输出。
4、awk 数组的运用
脚本中时间和url组成的数组key的运用,把两者关联起来
muri=m","uri;
实现如下功能
max[muri]
min[muri]
num[muri]
sum[muri]
time[muri]
二、发布服务器上的脚本
1、批量执行远程命令 fetch_srv_data.sh
[appdeploy@DeployServer scripts]$ cat fetch_srv_data.sh
#!/bin/bash
lists=`grep prod /app/deploy/scripts/distribute.cnf|grep -v -E "^#|gray|api|eurka"|grep Y|cut -d \| -f 3,5,8`
#lists=`grep prod /app/deploy/scripts/distribute.cnf|grep -v -E "^#|gray|api|eurka"|grep Y|cut -d \| -f 3,5,8|grep user`
locatpath='/app/maintenance/scripts'
scripts_path='/app/maintenance/scripts'
for p in $lists
do
host_ip=`echo $p|cut -d \| -f 1`
service_name=`echo $p|cut -d \| -f 2`
deploy_path=`echo $p|cut -d \| -f 3`
ansible ${host_ip} -m copy -a "src=${locatpath}/srv_perf_analyze.sh dest=${scripts_path} mode=0755" -i ${locatpath}/hosts
ansible ${host_ip} -m shell -a "sh ${scripts_path}/srv_perf_analyze.sh $host_ip $service_name $deploy_path" -i ${locatpath}/hosts
sleep 30s
done
2、srv_perf_analyze.sh
[appdeploy@DeployServer scripts]$ cat srv_perf_analyze.sh
#!/bin/bash
access_file="access.`date -d "-1 day" +"%Y-%m-%d"`.log"
service_ip=''\'$1''\'
service_name=''\'$2''\'
log_file=''\'$3"/logs"''\'
path=`echo $log_file|sed $'s/\'//g'`
MYSQL="mysql -ufemonitor -h10.200.130.4 -pMpriv#7821@thi --default-character-set=utf8 -A -N"
cat ${path}/${access_file}|grep -v HEAD |awk \
'
{u=split($8,arr,"?");uri=arr[1];
m=substr($2,1,5);
muri=m","uri;
if(max[muri] + 0 < $12 +0 )
{max[muri]=$12};
if(min[muri] + 0 == 0 || min[muri] + 0 > $12)
{min[muri] = $12} ;
num[muri]+=1;
sum[muri]+=$12;
time[muri]=$1" "m}
END{for(i in sum)
printf "insert into t_srv_perf_analyze \
(access_time,service_name,uri,access_num,max_resp,min_resp,avg_resp,service_ip,log_file) \
values \
(%-s,'$service_name',%-s,%d,%d,%d,%.2f,'$service_ip','$log_file');\n",\
"'\''"time[i]"'\''","'\''"substr(i,7)"'\''",num[i],max[i],min[i],sum[i]/num[i] \
}'|sort -n -k 9 -t','|tee /tmp/access_analyze.sql
$MYSQL fe_monitor </tmp/access_analyze.sql

浙公网安备 33010602011771号