弦音

【07-27】awk初探和案例分析~ | 弦音

【07-27】awk初探和案例分析~

这个排版,真的是操蛋了。
一个awk的学习网站:http://www.zsythink.net/archives/tag/awk/
一、知识点
1. awk是关联数组,会把数字下标转为字符串。可对比shell的关联数组做比较~
2. 两种for循环:
#for循环语法格式1
for(初始化; 布尔表达式; 更新) {
//代码语句
}

#for循环语法格式2
for(变量 in 数组) {
//代码语句
}

二、案例分析-
1. 统计CONNECTED和LISTEN的次数
1. netstat -anp | awk ‘$6~/CONNECTED|LISTEN/{sum[$6]++}END{for(i in sum) print i,sum[i]}’
1. ~ 是模式匹配符。!~ 非匹配。
2. // 匹配代码块,可以是字符串或正则表达式。
3. for(i in sum)其中i为数组的下标
2. 案例分析-奇技淫巧打印奇数行
1. awk ‘i=!i’ test.txt 等价于 awk ‘i=!i’ {print $0} test.txt
3. 案例-分析rpc日志
1.rpc日志格式:
2019-07-24 at 10:30:01.198 CST INFO Receive [Tid : 777363786, Service : UserInfo, method : checkToken, period : BEFORE]
2019-07-24 at 10:30:01.203 CST INFO Receive [Tid : 777363786, Service : UserInfo, method : checkToken, period : AFTER]
2019-07-24 at 10:30:01.233 CST INFO Receive [Tid : 979939127, Service : HostInfo, method : getAppStatus, period : BEFORE]
2019-07-24 at 10:30:01.241 CST INFO Receive [Tid : 979939127, Service : HostInfo, method : getAppStatus, period : AFTER]
2019-07-24 at 10:30:01.243 CST INFO Receive [Tid : 1473346553, Service : UserInfo, method : checkToken, period : BEFORE]
2019-07-24 at 10:30:01.245 CST INFO Receive [Tid : 1936865020, Service : HostInfo, method : getAppStatus, period : BEFORE]
2019-07-24 at 10:30:01.248 CST INFO Receive [Tid : 1358139400, Service : UserInfo, method : checkToken, period : BEFORE]
2019-07-24 at 10:30:01.249 CST INFO Receive [Tid : 1473346553, Service : UserInfo, method : checkToken, period : AFTER]
分析:
1. 分析每个tid的调用耗时超过1s的,并输出超时的次数和相关信息
1. cat rpc.log | awk ‘BEGIN {count=0}{if(list[$9]&&$18==”AFTER]”){timestamp1=mktime(substr(list[$9],1,4)” “substr(list[$9],6,2)” “substr(list[$9],9,2)” “substr(list[$9],11,2)” “substr(list[$9],14,2)” “substr(list[$9],17,2));timestamp2=mktime(substr($1$3,1,4)” “substr($1$3,6,2)” “substr($1$3,9,2)” “substr($1$3,11,2)” “substr($1$3,14,2)” “substr($1$3,17,2));r=(timestamp2-timestamp1);if(r>10){count++;print list[$9]”-“$3”-“r}list[$9]=null;}else{list[$9]=$1$3}}END{print count}’
1. mktime()函数使用方式 mktime(“2013 01 04 12 12 12”)
2. substr()函数使用方式 返回从起始位置起,指定长度之子字符串;若未指定长度,则返回从起始位置到字符串末尾的子字符串。如substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分。
3. 可参考strftime()函数
2. cat rpc.log | awk ‘BEGIN {count=0}{if(list[$9]&&$18==”AFTER]”){groups=”^(….)-(..)-(..)(..):(..):(..).*”;format=”\\1 \\2 \\3 \\4 \\5 \\6″;timestamp1=mktime(datespec=gensub(groups,format,””,list[$9]));timestamp2=mktime(datespec=gensub(groups,format,””,$1$3));r=(timestamp2-timestamp1);if(r>10){count++;print list[$9]”-“$3”-“r}list[$9]=null;}else{list[$9]=$1$3}}END{print count}’
1. gensub()函数:匹配正则,全局替换。
2. 分析tid超过一个配对的数量(一个before对应多个after)
1. awk ‘{list[$9]++}{for(e in list){if(list[e]>2){print e}}}’ rpc.log
3. 分析不同的service,一分钟内被调用次数枚举
1. awk ‘{m=substr($3,1,5);apis[$15,m]++;}END{for(api in apis){print api”,”apis[api]}}’
1. awk实际没有二维数组,下标是由一个特殊的字符串SUBSEP (\034)作为分割字段

2019年7月27日 0 / /
标签:  暂无标签

5 + 1 =

回到顶部