您的位置:首页 > 其它

awk之思维导图

2016-12-07 14:40 375 查看
转载自:http://www.furion.info/338.html

最近线上经常遇到日志统计方面的需求,直接上python吧,嫌的有点大材小用。放着这么牛逼的awk不用搞毛的python。于是抽了段时间好好练练awk。

     简单的画了张图:

    

    



 

     同样没啥可说的,熟悉了之后发现awk用起来很爽很爽,而且常用的真的没有太多的东西。 

Contents [hide]

1 1.基本语法:

2 2.组成结构:

3 3.内置变量:

3.1 4.分隔符:

4 5.范围匹配:

5 6.字符串相关函数:

6 7.时间:

7 8.打印:

8 9.关联数组:

9 10.排序:

10 11.实战:

11           
没啥特别的,稍微改下就可以实现域名流量的统计了,现在只是统计了响应码的分布情况。

12 12.总结:


1.基本语法:

    没啥多说的,唯一常用的就是-F这个参数了,用来修改记录分隔符。-f则用来将复杂的awk命令写成脚本,方便复用以及维护。 


2.组成结构:

    想真的了解awk那就必须了解awk的构成,awk其实有三个块构成,BEGIN 、BODY、END,其实BEGIN、END都是可选的。

    这里说下BEGIN、END的作用,BEGIN常用作设置一些变量如FS、打印一些输出头信息等。END则用来输出统计结果、打印结尾信息等。需要注意的是BEGIN、END都会只执行一次,而不像BODY每行都会执行一次。


3.内置变量:  

    awk内置了很多的变量,常用的有NR、NF、$0等。

    $0、$1则用来临时存放awk保存的字段。$0代表整行,$1则代表第一个字段等。

    IGNORECASE比较特别,是用来控制大小写敏感的,默认是0即大小写敏感的,如果想不区分大小写进行匹配那我们可以将其设置为1。


4.分隔符:

    awk的强大就在于提供了多个内置变量供我们灵活的设置相应的输入、输出分隔符。

    FS、OFS为字段分隔符,不同的是FS为输入字段分隔符,OFS为输出字段分隔符,这里我们就可以灵活的根据文本特征设置,同样还可以按照打印的要求设置OFS进行输出。

    RS、ORS为记录分隔符,也就是行分隔符,ORS同理为输出记录分隔符。


5.范围匹配:

    和sed一样,如果没有指定范围,awk默认是会对所有的行进行处理的。我们可以指定特定范围的文本执行特定的awk命令。常用的有两种方式:

    a)/^102/,直接patten的形式

    b)~ “Ten”,  ~表示正则匹配 


6.字符串相关函数:

    这部分awk提供了很多的函数用来支持字符串的操作,如length、index、match以及sub、gsub等。

    sub与gsub的区别在于gsub是全局的替换,而sub则只替换第一个出现的文本。

    split则可以根据给定的分隔符再次分割字符串,这点是非常牛掰的。因为我们有时候会遇到这种需求:文本比较复杂,无法一次设置合适的FS进行提取,往往使用管道再次使用awk进行提取。而split则可以实现再次分割的功能,从而省去一次管道操作。


7.时间:

    时间常用的为strftime函数,可以将Unix时间戳转换为直接可读的时间信息。常用在日志统计等场合。 


8.打印:

    awk中有两个打印相关的命令:print和printf。两者的差别在于print使用OFS、ORS等输出分隔符信息进行格式化,而printf则采用C语言中的相关格式化格式,可以提供更强大的格式化功能。


9.关联数组:

    关联数组在awk中非常实用,在统计各种数据的时候非关联数组不可。

    关联数组的常用操作如下:

        a)if( index in array-name ) : 判断元素是否存在

        b)for (var in array-name ) : 遍历数组

          c)delete array[var]:     删除数组中某个元素


10.排序: 
 

    awk中采用asort以及asorti进行排序,两者的区别在于asort是对数组元素进行排序,而asorti则是对键值进行排序。需要注意的是两者如果不指定第二个参数,则都会修改原数组。一般可以给出第二个参数,利用第二个参数来保存排序之后的结果。 


11.实战:

    学了很么多,不动手写点实在说不过去,正好模拟下我们经常用的squidlog –s 这个命令了:

                              



 

采用awk模拟上图的效果,模拟效果如下:这个命令的输出如下:

                               

 

      怎么样,是不是有点感觉?

      相关的代码如下:
{
#filed 4 is the http return code
codes[$4]+=1;
#get the total request count
total+=1;
#get the hit request count
if( $4 ~ "HIT")
hit+=1 ;
#get the first request time
if(NR ==1 )
start_time=strftime("%F_%T",$1)
}

END {
#get the last request time
end_time=strftime("%F-%T",$1);
printf "Starting time:\t%s\n",start_time;
printf "End time:\t%s\n",end_time;
printf "\n------------------------------------------------------\n";
printf "Number\t\t%-30s\t%.10s\n","Status/Code","Percent";
for(i in codes){
printf "%s\t\t%-30s\t%.5s%%\n",codes[i],i,codes[i]/total*100  };
printf "\n------------------------------------------------------\n";
#print the rate of miss
printf "\tDirector/orignal:\t%s\n\n",(total-hit)/total
} 


       没啥特别的,稍微改下就可以实现域名流量的统计了,现在只是统计了响应码的分布情况。


12.总结:

       awk功能非常多,学习起来比sed等要稍微复杂,但回报也是很可观的。awk数据统计方面的能力果断要甩出sed等好几条街啊。

      熟练的使用awk可以搞定各种日志统计、分析任务,现在简单的日志各类流量大小统计、域名访问次数统计已经阻挡不了我了。总之awk值得一学,简直是旅行、居家必备的工具呀。

相关文章:1.Awk使用案例总结(运维必会)http://lizhenliang.blog.51cto.com/7876557/1764025
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: