In addition to Weibo, there is also WeChat
Please pay attention
WeChat public account
Shulou
2025-03-30 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Development >
Share
Shulou(Shulou.com)06/01 Report--
这篇文章主要为大家展示了"Linux如何使用AWK",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Linux如何使用AWK"这篇文章吧。
awk是处理文本文件的一个应用程序,几乎所有 Linux 系统都自带这个程序,它依次处理文件的每一行,并读取里面的每一个字段。对于日志、CSV 那样的每行格式相同的文本文件,awk可能是最方便的工具。
img1、分析访问日志(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.log2、两个文件差异对比文件内容:# 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 b3、合并两个文件文件内容:# 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]}'lohel6、统计出现的次数统计字符串中每个字母出现的次数:# echo "a.b.c,c.d.e" |awk -F'[.,]' '{for(i=1;ia 1b 1c 2d 1e 17、费用统计得出每个员工出差总费用及次数:# 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 38、获取某列数字最大数# 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 39、去除文本第一行和最后一行# 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++作为计数器。以上是"Linux如何使用AWK"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.
Views: 0
*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.
Continue with the installation of the previous hadoop.First, install zookooper1. Decompress zookoope
"Every 5-10 years, there's a rare product, a really special, very unusual product that's the most un
© 2024 shulou.com SLNews company. All rights reserved.