awk中不能直接用$var来引用shell的变量,昨天写的shell脚本,有一列是不正确的,导致最后一列>50那处数据不正确,悲催的语法。有空再把质量统计数据加入到支撑平台吧。
#app avg quality
echo "app avg quality:"
awk -F , '$5==" app=blog"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
awk -F , '$5==" app=mblog"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
awk -F , '$5==" app=album"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
awk -F , '$5==" app=video"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
awk -F , '$5==" app=profile"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
awk -F , '$5==" app=guestbook"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
awk -F , '$5==" app=discuss"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
awk -F , '$5==" app=request"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
awk -F , '$5==" app=setting"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
awk -F , '$5==" app=scomment"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
#app network quality >50
echo "app network quality >$normal"
awk -F , '{if($5==" app=blog"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath
awk -F , '{if($5==" app=mblog"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath
awk -F , '{if($5==" app=album"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath
awk -F , '{if($5==" app=video"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath
awk -F , '{if($5==" app=profile"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath
awk -F , '{if($5==" app=guestbook"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath
awk -F , '{if($5==" app=discuss"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath
awk -F , '{if($5==" app=request"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath
awk -F , '{if($5==" app=setting"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath
awk -F , '{if($5==" app=scomment"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath ;
#上面的$(normal)是不正确的,会导致数据计算出错。
awk在调用shell变量时,需要使用参数-v,修改后:
awk -v normal=$normal -F , '{if($5==" app=scomment"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>normal){j++}};END{print j+0}' $currentFilePath ;
其中$normal、为shell中变量,可以看出,每调用一次变量都要加一个-v参数,后面使用shell变量的时候,就不用加$了,直接用normal就好了。
其中$currentFilePath不在awk语句中,所以不受影响。
ps:sed一般使用单引号,sed引用shell变量时使用双引号即可,因为双引号是弱转义,不会去除$的变量表示功能,而单引号为强转义,会把$作为一般符号表示,所以不会表示为变量。