今天小编给大家分享一下AWK实用实例有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1、分析访问日志(Nginx为例)

日志格式:'$remote_addr-$remote_user[$time_local]"$request"$status$body_bytes_sent"$http_referer""$http_user_agent""$http_x_forwarded_for"'统计访问IP次数:#awk'{a[$1]++}END{for(vina)printv,a[v]}'access.log统计访问访问大于100次的IP:#awk'{a[$1]++}END{for(vina){if(a[v]>100)printv,a[v]}}'access.log统计访问IP次数并排序取前10:#awk'{a[$1]++}END{for(vina)printv,a[v]|"sort-k2-nr|head-10"}'access.log统计时间段访问最多的IP:#awk'$4>="[02/Jan/2017:00:02:00"&&$4统计上一分钟访问量:#date=$(date-d'-1minute'+%d/%d/%Y:%H:%M)#awk-vdate=$date'$4~date{c++}END{printc}'access.log统计访问最多的10个页面:#awk'{a[$7]++}END{for(vina)printv,a[v]|"sort-k1-nr|head-n10"}'access.log统计每个URL数量和返回内容总大小:#awk'{a[$7]++;size[$7]+=$10}END{for(vina)printa[v],v,size[v]}'access.log统计每个IP访问状态码数量:#awk'{a[$1""$9]++}END{for(vina)printv,a[v]}'access.log统计访问IP是404状态次数:#awk'{if($9~/404/)a[$1""$9]++}END{for(iina)printv,a[v]}'access.log2、两个文件差异对比

文件内容:#seq15>a#seq37>b找出b文件在a文件相同记录:方法1:#awk'FNR==NR{a[$0];next}{if($0ina)print$0}'ab345#awk'FNR==NR{a[$0];next}{if($0ina)printFILENAME,$0}'abb3b4b5#awk'FNR==NR{a[$0]}NR>FNR{if($0ina)print$0}'ab345#awk'FNR==NR{a[$0]=1;next}(a[$0]==1)'ab#a[$0]是通过b文件每行获取值,如果是1说明有#awk'FNR==NR{a[$0]=1;next}{if(a[$0]==1)print}'ab345方法2:#awk'FILENAME=="a"{a[$0]}FILENAME=="b"{if($0ina)print$0}'ab345方法3:#awk'ARGIND==1{a[$0]=1}ARGIND==2&&a[$0]==1'ab345找出b文件在a文件不同记录:方法1:#awk'FNR==NR{a[$0];next}!($0ina)'ab67#awk'FNR==NR{a[$0]=1;next}(a[$0]!=1)'ab#awk'FNR==NR{a[$0]=1;next}{if(a[$0]!=1)print}'ab67方法2:#awk'FILENAME=="a"{a[$0]=1}FILENAME=="b"&&a[$0]!=1'ab方法3:#awk'ARGIND==1{a[$0]=1}ARGIND==2&&a[$0]!=1'ab3、合并两个文件

文件内容:#catazhangsan20lisi23wangwu29#catbzhangsanmanlisiwomanwangwuman将a文件合并到b文件:方法1:#awk'FNR==NR{a[$1]=$0;next}{printa[$1],$2}'abzhangsan20manlisi23womanwangwu29man方法2:#awk'FNR==NR{a[$1]=$0}NR>FNR{printa[$1],$2}'abzhangsan20manlisi23womanwangwu29man将a文件相同IP的服务名合并:#cata192.168.1.1:httpd192.168.1.1:tomcat192.168.1.2:httpd192.168.1.2:postfix192.168.1.3:mysqld192.168.1.4:httpd#awk'BEGIN{FS=":";OFS=":"}{a[$1]=a[$1]$2}END{for(vina)printv,a[v]}'a192.168.1.4:httpd192.168.1.1:httpdtomcat192.168.1.2:httpdpostfix192.168.1.3:mysqld解读:数组a存储是$1=a[$1]$2,第一个a[$1]是以第一个字段为下标,值是a[$1]$2,也就是$1=a[$1]$2,值的a[$1]是用第一个字段为下标获取对应的值,但第一次数组a还没有元素,那么a[$1]是空值,此时数组存储是192.168.1.1=httpd,再遇到192.168.1.1时,a[$1]通过第一字段下标获得上次数组的httpd,把当前处理的行第二个字段放到上一次同下标的值后面,作为下标192.168.1.1的新值。此时数组存储是192.168.1.1=httpdtomcat。每次遇到相同的下标(第一个字段)就会获取上次这个下标对应的值与当前字段并作为此下标的新值。4、将第一列合并到一行

#catfile123456789#awk'{for(i=1;i147258369解读:for循环是遍历每行的字段,NF等于3,循环3次。读取第一行时:第一个字段:a[1]=a[1]1""值a[1]还未定义数组,下标也获取不到对应的值,所以为空,因此a[1]=1。第二个字段:a[2]=a[2]2""值a[2]数组a已经定义,但没有2这个下标,也获取不到对应的值,为空,因此a[2]=2。第三个字段:a[3]=a[3]3""值a[2]与上面一样,为空,a[3]=3。读取第二行时:第一个字段:a[1]=a[1]4""值a[2]获取数组a的2为下标对应的值,上面已经有这个下标了,对应的值是1,因此a[1]=14第二个字段:a[2]=a[2]5""同上,a[2]=25第三个字段:a[3]=a[3]6""同上,a[2]=36读取第三行时处理方式同上,数组最后还是三个下标,分别是1=147,2=258,3=369。最后for循环输出所有下标值。5、字符串拆分

字符串拆分:方法1:#echo"hello"|awk-F'''{for(i=1;ihello方法2:#echo"hello"|awk'{split($0,a,"''");for(vina)printa[v]}'lohel6、统计出现的次数

统计字符串中每个字母出现的次数:#echo"a.b.c,c.d.e"|awk-F'[.,]''{for(i=1;ia1b1c2d1e17、费用统计

得出每个员工出差总费用及次数:#catazhangsan80001zhangsan50001lisi10001lisi20001wangwu15001zhaoliu60001zhaoliu20001zhaoliu30001#awk'{name[$1]++;cost[$1]+=$2;number[$1]+=$3}END{for(vinname)printv,cost[v],number[v]}'azhangsan50001lisi30002wangwu15001zhaoliu1100038、获取某列数字最大数

#cataab1cd2ef3gh3ij2获取第三字段最大值:#awk'BEGIN{max=0}{if($3>max)max=$3}END{printmax}'a3打印第三字段最大行:#awk'BEGIN{max=0}{a[$0]=$3;if($3>max)max=$3}END{for(vina)if(a[v]==max)printv}'agh3ef39、去除文本第一行和最后一行

#seq5|awk'NR>2{prints}{s=$0}'234解读:读取第一行,NR=1,不执行prints,s=1读取第二行,NR=2,不执行prints,s=2(大于为真)读取第三行,NR=3,执行prints,此时s是上一次p赋值内容2,s=3最后一行,执行prints,打印倒数第二行,s=最后一行10、获取Nginx upstream块内后端IP和端口

#cataupstreamexample-servers1{server127.0.0.1:80weight=1max_fails=2fail_timeout=30s;}upstreamexample-servers2{server127.0.0.1:80weight=1max_fails=2fail_timeout=30s;server127.0.0.1:82backup;}#awk'/example-servers1/,/}/{if(NR>2){prints}{s=$2}}'a127.0.0.1:80#awk'/example-servers1/,/}/{if(i>1)prints;s=$2;i++}'a#awk'/example-servers1/,/}/{if(i>1){prints}{s=$2;i++}}'a127.0.0.1:80解读:读取第一行,i初始值为0,0>1为假,不执行prints,x=example-servers1,i=1读取第二行,i=1,1>1为假,不执行prints,s=127.0.0.1:80,i=2读取第三行,i=2,2>1为真,执行prints,此时s是上一次s赋值内容127.0.0.1:80,i=3最后一行,执行prints,打印倒数第二行,s=最后一行。这种方式与上面一样,只是用i++作为计数器。

以上就是“AWK实用实例有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。