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.总结:
没啥多说的,唯一常用的就是-F这个参数了,用来修改记录分隔符。-f则用来将复杂的awk命令写成脚本,方便复用以及维护。
想真的了解awk那就必须了解awk的构成,awk其实有三个块构成,BEGIN 、BODY、END,其实BEGIN、END都是可选的。
这里说下BEGIN、END的作用,BEGIN常用作设置一些变量如FS、打印一些输出头信息等。END则用来输出统计结果、打印结尾信息等。需要注意的是BEGIN、END都会只执行一次,而不像BODY每行都会执行一次。
awk内置了很多的变量,常用的有NR、NF、$0等。
$0、$1则用来临时存放awk保存的字段。$0代表整行,$1则代表第一个字段等。
IGNORECASE比较特别,是用来控制大小写敏感的,默认是0即大小写敏感的,如果想不区分大小写进行匹配那我们可以将其设置为1。
awk的强大就在于提供了多个内置变量供我们灵活的设置相应的输入、输出分隔符。
FS、OFS为字段分隔符,不同的是FS为输入字段分隔符,OFS为输出字段分隔符,这里我们就可以灵活的根据文本特征设置,同样还可以按照打印的要求设置OFS进行输出。
RS、ORS为记录分隔符,也就是行分隔符,ORS同理为输出记录分隔符。
和sed一样,如果没有指定范围,awk默认是会对所有的行进行处理的。我们可以指定特定范围的文本执行特定的awk命令。常用的有两种方式:
a)/^102/,直接patten的形式
b)~ “Ten”, ~表示正则匹配
这部分awk提供了很多的函数用来支持字符串的操作,如length、index、match以及sub、gsub等。
sub与gsub的区别在于gsub是全局的替换,而sub则只替换第一个出现的文本。
split则可以根据给定的分隔符再次分割字符串,这点是非常牛掰的。因为我们有时候会遇到这种需求:文本比较复杂,无法一次设置合适的FS进行提取,往往使用管道再次使用awk进行提取。而split则可以实现再次分割的功能,从而省去一次管道操作。
时间常用的为strftime函数,可以将Unix时间戳转换为直接可读的时间信息。常用在日志统计等场合。
awk中有两个打印相关的命令:print和printf。两者的差别在于print使用OFS、ORS等输出分隔符信息进行格式化,而printf则采用C语言中的相关格式化格式,可以提供更强大的格式化功能。
关联数组在awk中非常实用,在统计各种数据的时候非关联数组不可。
关联数组的常用操作如下:
a)if( index in array-name ) : 判断元素是否存在
b)for (var in array-name ) : 遍历数组
c)delete array[var]: 删除数组中某个元素
awk中采用asort以及asorti进行排序,两者的区别在于asort是对数组元素进行排序,而asorti则是对键值进行排序。需要注意的是两者如果不指定第二个参数,则都会修改原数组。一般可以给出第二个参数,利用第二个参数来保存排序之后的结果。
学了很么多,不动手写点实在说不过去,正好模拟下我们经常用的squidlog –s 这个命令了:
采用awk模拟上图的效果,模拟效果如下:这个命令的输出如下:
怎么样,是不是有点感觉?
相关的代码如下:
awk功能非常多,学习起来比sed等要稍微复杂,但回报也是很可观的。awk数据统计方面的能力果断要甩出sed等好几条街啊。
熟练的使用awk可以搞定各种日志统计、分析任务,现在简单的日志各类流量大小统计、域名访问次数统计已经阻挡不了我了。总之awk值得一学,简直是旅行、居家必备的工具呀。
相关文章:1.Awk使用案例总结(运维必会)http://lizhenliang.blog.51cto.com/7876557/1764025
最近线上经常遇到日志统计方面的需求,直接上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
相关文章推荐
- 思维导图
- 思维导图--数据结构导论(3)
- 怎样用XMind快速制作思维导图
- 线性表思维导图
- JavaScript 图解思维导图
- 线性表思维导图
- 渗透思维导图
- 思维导图 || 统计学习三要素
- 几款思维导图的调研与选择(最后选择了TheBrain)
- XMLHttpRequest对象思维导图
- 程序员的思维修炼-开发认知潜能的九堂课之思维导图
- java集合框架总结之思维导图
- 数据库设计思维导图
- 数学思维导图
- 安卓apk渗透思维导图
- 一套最全的JavaScript 语言基础知识点总结(思维导图10张)
- 思维导图热议《微微一笑很倾城》
- javascript学习之思维导图
- 思维导图_Linux中的重要日志文件
- 查找技术思维导图