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

  

 

posted @ 2019-03-19 11:44  Gringer  阅读(620)  评论(0)    收藏  举报