Linux如何使用AWK(awk,linux,开发技术)

时间:2024-05-07 05:17:08 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

awk是处理文本文件的一个应用程序,几乎所有 Linux 系统都自带这个程序,它依次处理文件的每一行,并读取里面的每一个字段。对于日志、CSV 那样的每行格式相同的文本文件,awk可能是最方便的工具。

Linux如何使用AWK
img

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.log

2、两个文件差异对比

文件内容:#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'ab

3、合并两个文件

文件内容:#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]}'lohel

6、统计出现的次数

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

7、费用统计

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

8、获取某列数字最大数

#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}'agh3ef3

9、去除文本第一行和最后一行

#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++作为计数器。
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:Linux如何使用AWK的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:wget如何使用下一篇:

5 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18