论坛首页 综合技术论坛

awk中调用shell变量注意事项

浏览 2076 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-11-06  
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[color=red]>$(normal[/color])){j++}};END{print j+0}' $currentFilePath ;

#上面的是不正确的

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变量时使用双引号即可,因为双引号是弱转义,不会去除$的变量表示功能,而单引号为强转义,会把$作为一般符号表示,所以不会表示为变量。

论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics