AWK实用实例有哪些
发表于:2024-09-28 作者:千家信息网编辑
千家信息网最后更新 2024年09月28日,今天小编给大家分享一下AWK实用实例有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下
千家信息网最后更新 2024年09月28日AWK实用实例有哪些
今天小编给大家分享一下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(v in a)print v,a[v]}' access.log统计访问访问大于100次的IP:# awk '{a[$1]++}END{for(v ina){if(a[v]>100)print v,a[v]}}' access.log统计访问IP次数并排序取前10:# awk '{a[$1]++}END{for(v in a)print v,a[v]|"sort -k2 -nr |head -10"}' access.log统计时间段访问最多的IP:# awk'$4>="[02/Jan/2017:00:02:00" &&$4统计上一分钟访问量:# date=$(date -d '-1 minute'+%d/%d/%Y:%H:%M)# awk -vdate=$date '$4~date{c++}END{printc}' access.log统计访问最多的10个页面:# awk '{a[$7]++}END{for(vin a)print v,a[v]|"sort -k1 -nr|head -n10"}' access.log统计每个URL数量和返回内容总大小:# awk '{a[$7]++;size[$7]+=$10}END{for(v ina)print a[v],v,size[v]}' access.log统计每个IP访问状态码数量:# awk '{a[$1" "$9]++}END{for(v ina)print v,a[v]}' access.log统计访问IP是404状态次数:# awk '{if($9~/404/)a[$1" "$9]++}END{for(i in a)print v,a[v]}' access.log
2、两个文件差异对比
文件内容:# seq 1 5 > a# seq 3 7 > b找出b文件在a文件相同记录:方法1:# awk 'FNR==NR{a[$0];next}{if($0 in a)print $0}' a b345# awk 'FNR==NR{a[$0];next}{if($0 in a)print FILENAME,$0}' a bb 3b 4b 5# awk 'FNR==NR{a[$0]}NR>FNR{if($0 ina)print $0}' a b345# awk 'FNR==NR{a[$0]=1;next}(a[$0]==1)' a b # a[$0]是通过b文件每行获取值,如果是1说明有# awk 'FNR==NR{a[$0]=1;next}{if(a[$0]==1)print}' a b345方法2:# awk 'FILENAME=="a"{a[$0]}FILENAME=="b"{if($0 in a)print $0}' a b345方法3:# awk 'ARGIND==1{a[$0]=1}ARGIND==2 && a[$0]==1' a b345找出b文件在a文件不同记录:方法1:# awk 'FNR==NR{a[$0];next}!($0 in a)' a b67# awk 'FNR==NR{a[$0]=1;next}(a[$0]!=1)' a b# awk'FNR==NR{a[$0]=1;next}{if(a[$0]!=1)print}' a b67方法2:# awk'FILENAME=="a"{a[$0]=1}FILENAME=="b" && a[$0]!=1' a b方法3:# awk 'ARGIND==1{a[$0]=1}ARGIND==2 && a[$0]!=1' a b
3、合并两个文件
文件内容:# cat azhangsan 20lisi 23wangwu 29# cat bzhangsan manlisi womanwangwu man将a文件合并到b文件:方法1:# awk 'FNR==NR{a[$1]=$0;next}{print a[$1],$2}' a bzhangsan 20 manlisi 23 womanwangwu 29 man方法2:# awk 'FNR==NR{a[$1]=$0}NR>FNR{print a[$1],$2}' a bzhangsan 20 manlisi 23 womanwangwu 29 man将a文件相同IP的服务名合并:# cat a192.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(v in a)print v,a[v]}' a192.168.1.4: httpd192.168.1.1: httpd tomcat192.168.1.2: httpd postfix192.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=httpd tomcat。每次遇到相同的下标(第一个字段)就会获取上次这个下标对应的值与当前字段并作为此下标的新值。
4、将第一列合并到一行
# cat file1 2 34 5 67 8 9# awk '{for(i=1;i1 4 72 5 83 6 9解读: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]=1 4第二个字段:a[2]=a[2]5" " 同上,a[2]=2 5第三个字段:a[3]=a[3]6" " 同上,a[2]=3 6读取第三行时处理方式同上,数组最后还是三个下标,分别是1=1 4 7,2=2 5 8,3=36 9。最后for循环输出所有下标值。
5、字符串拆分
字符串拆分:方法1:# echo "hello" |awk -F '''{for(i=1;ihello方法2:# echo "hello" |awk '{split($0,a,"''");for(v in a)print a[v]}'lohel
6、统计出现的次数
统计字符串中每个字母出现的次数:# echo "a.b.c,c.d.e" |awk -F'[.,]' '{for(i=1;ia 1b 1c 2d 1e 1
7、费用统计
得出每个员工出差总费用及次数:# cat azhangsan 8000 1zhangsan 5000 1lisi 1000 1lisi 2000 1wangwu 1500 1zhaoliu 6000 1zhaoliu 2000 1zhaoliu 3000 1# awk '{name[$1]++;cost[$1]+=$2;number[$1]+=$3}END{for(v in name)print v,cost[v],number[v]}' azhangsan 5000 1lisi 3000 2wangwu 1500 1zhaoliu 11000 3
8、获取某列数字最大数
# cat aa b 1c d 2e f 3g h 3i j 2获取第三字段最大值:# awk 'BEGIN{max=0}{if($3>max)max=$3}END{print max}' a3打印第三字段最大行:# awk 'BEGIN{max=0}{a[$0]=$3;if($3>max)max=$3}END{for(v in a)if(a[v]==max)print v}'ag h 3e f 3
9、去除文本第一行和最后一行
# seq 5 |awk'NR>2{print s}{s=$0}'234解读:读取第一行,NR=1,不执行print s,s=1读取第二行,NR=2,不执行print s,s=2 (大于为真)读取第三行,NR=3,执行print s,此时s是上一次p赋值内容2,s=3最后一行,执行print s,打印倒数第二行,s=最后一行
10、获取Nginx upstream块内后端IP和端口
# cat aupstream example-servers1 { server 127.0.0.1:80 weight=1 max_fails=2fail_timeout=30s;}upstream example-servers2 { server 127.0.0.1:80 weight=1 max_fails=2fail_timeout=30s; server 127.0.0.1:82 backup;}# awk '/example-servers1/,/}/{if(NR>2){print s}{s=$2}}' a127.0.0.1:80# awk '/example-servers1/,/}/{if(i>1)print s;s=$2;i++}' a# awk '/example-servers1/,/}/{if(i>1){print s}{s=$2;i++}}' a127.0.0.1:80解读:读取第一行,i初始值为0,0>1为假,不执行print s,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最后一行,执行print s,打印倒数第二行,s=最后一行。这种方式与上面一样,只是用i++作为计数器。
以上就是"AWK实用实例有哪些"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。
字段
下标
文件
统计
一行
方法
数组
内容
次数
知识
篇文章
上一
最大
相同
三个
字符
字符串
三行
存储
循环
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
岳麓区软件开发技工学校
不同数据库之间的匹配关联研究
多益软件开发面经
破坏他人服务器是犯法的吗
网络安全辟谣进校园
延时低的美国服务器
安卓服务器在什么地方
软件开发公司转让合同
网络安全怎么宣传标语
移动的网络技术发展趋势
邮箱数据库设计
服务器管理员日常生活
c连接数据库查询
软件开发成本评估原则
数据库查询数据类型
数据库表设为非空
北京智能软件开发定制
安卓 app用什么软件开发
数据库表的定义
数据库 XDM
泉州软件开发哪家好
怎么确定数据库连接池的个数
黑群晖nas存储服务器
网络安全里的英文专业词汇
服务器和存储
安徽九娱网络技术有限公司上市
m服务器前三
邹平软件开发服务
涪陵区媒体网络技术欢迎咨询
合肥万户网络技术