awk 功能强大,可以处理文本,筛选需要的信息,这里不再多说,有兴趣的可以上网搜,我在这里只讲awk 怎样使用if else。
在网上查了好久,在shell使用awk 的 if else if else 时,网上给的列子是这样的:
awk '{if ($1==1) print "A" else if ($1==2) print "B" else print "C"}'
尝试了好久也不对,找不到哪儿的错误,后来听大神讲到,每个语句后面都有分号,正确的应该是这样的
awk '{if ($1==1) print "A"; else if ($1==2) print "B"; else print "C"}'
拓展:
awk中也支持++或者+=运算符
grep '接口耗时:' test.log|cut -d "m" -f 1 |cut -d ":" -f 2|awk 'BEGIN {count=ms1=ms2=ms3=0}{if($1<1) ms1++;else if($1>=1&&$1<=5) ms2++;else ms3++;count++}END{print "ms1,ms1占 比 ",ms1,",",ms1/count*100,"%";print "ms2,ms2占比",ms2,",",ms2/count*100,"%";print "ms3,ms3占比",ms3,",",ms3/count*100,"%"}'
上述命令输出的结果为:
xxx@xxxdeMacBook-Pro-142 ~ % grep '接口耗时:' test.log|cut -d "m" -f 1 |cut -d ":" -f 2|awk 'BEGIN {count=0;ms1=0;ms2=0;ms3=0}{if($1<1) ms1++;else if($1>=1&&$1<=5) ms2++;else ms3++;count++}END{print "ms1,ms1 占比",ms1,",",ms1/count*100,"%";print "ms2,ms2占比",ms2,",",ms2/count*100,"%";print "ms3,ms3占比",ms3,",",ms3/count*100,"%"}'
ms1,ms1占比 0 , 0 %
ms2,ms2占比 17 , 89.4737 %
ms3,ms3占比 2 , 10.5263 %
存在的问题是输出的百分比带了4位小数,怎么样保留2位小数呢?
解决办法是可以使用printf格式化输出
修改后输出结果如下:
xxx@xxxdeMacBook-Pro-142 ~ % grep '接口耗时:' test.log|cut -d "m" -f 1 |cut -d ":" -f 2|awk 'BEGIN {count=ms1=ms2=ms3=0}{if($1<1) ms1++;else if($1>=1&&$1<=5) ms2++;else ms3++;count++}END{printf ("ms1,ms1占比 %s,%.2f",ms1,ms1/count*100,"%");printf ("ms2,ms2占比 %s,%.2f",ms2,ms2/count*100,"%");printf ("ms3,ms3占比 %s,%.2f",ms3,ms3/count*100,"%")}'
ms1,ms1占比 0,0.00ms2,ms2占比 17,89.47ms3,ms3占比 2,10.53%
可以看到虽然百分比是保留到2位小数了,但是每个统计结果没有换行显示
解决办法是加换行符\n,输出结果如下:
xxx@xxxdeMacBook-Pro-142 ~ % grep '接口耗时:' test.log|cut -d "m" -f 1 |cut -d ":" -f 2|awk 'BEGIN {count=ms1=ms2=ms3=0}{if($1<1) ms1++;else if($1>=1&&$1<=5) ms2++;else ms3++;count++}END{printf ("ms1,ms1占比 %s,%.2f\n",ms1,ms1/count*100);printf ("ms2,ms2占比 %s,%.2f\n",ms2,ms2/count*100);printf ("ms3,ms3占比 %s,%.2f",ms3,ms3/count*100)}'
ms1,ms1占比 0,0.00
ms2,ms2占比 17,89.47
ms3,ms3占比 2,10.53
又出现了新问题就是最后的百分比没有带%
查询资料得知printf函数格式化支持一下格式,所以要打印%应该使用两个%%
%的转换说明及作为结果的打印输出
%a 浮点数、十六进制数字和p-记数法(C99)
%A 浮点数、十六进制数字和p-记法(C99)
%c 一个字符
%d 有符号十进制整数
%e 浮点数、e-记数法
%E 浮点数、E-记数法
%f 浮点数、十进制记数法
%g 根据数值不同自动选择%f或%e.
%G 根据数值不同自动选择%f或%e.
%i 有符号十进制数(与%d相同)
%o 无符号八进制整数
%p 指针
%s 字符串
%u 无符号十进制整数
%x 使用十六进制数字0f的无符号十六进制整数
%X 使用十六进制数字0f的无符号十六进制整数
%% 打印一个百分号
于是修改脚本为:
xxx@xxxdeMacBook-Pro-142 ~ % grep '接口耗时:' test.log|cut -d "m" -f 1 |cut -d ":" -f 2|awk 'BEGIN {count=ms1=ms2=ms3=0}{if($1<1) ms1++;else if($1>=1&&$1<=5) ms2++;else ms3++;count++}END{printf ("ms1,ms1占比 %s,%.2f%%\n",ms1,ms1/count*100);printf ("ms2,ms2占比 %s,%.2f%%\n",ms2,ms2/count*100);printf ("ms3,ms3占比 %s,%.2f",ms3,ms3/count*100,"%")}'
输出结果如下:
至此问题解决。