4.1特点与应用场景

awk

一门语言,类似于C语言过滤,统计,计算过滤,统计日志

4.2 awk内置变量

内置变量
示例
NRNumber or Record记录号,行号
NFNumber of Field每行有多个字段(列) $NF表示最后一列awk '{print $NF}' 文件名
FS-F: ===-v FS=: Field Separator字段分隔符,每个字段结束标记
OFSOutput Field Separator 输出字段分隔符,(awk显示每一列的时候,每一列之间通过什么分割,默认是空格)awk -F: -v OFS=: '{print $NF,$2,$3,$4,$5,$6,$1}'文件名

Image.png

4.3行与列

名词awk中叫法一些说明
记录record每一行默认通过回车分割
字段域field每一列默认通过空格分割
awk中行和列结束标记都是可以修改的

1)取行

awk
示例
NR==1取出某一行awk 'NR==1' access.log.20220304000301
NR>1&&NR<=5取出1到5行范围
/oldboy/

/101/,/105/

符号> < >= <= == !=

2)取列

-F指定分隔符指定每一列结束标记(默认是空格,连续的空格,tab键)$数字取出某一列,注意:在awk中$内容一个意思表示取出某一列$0整行的内容,{printxxx}$NF表示最后一列(示例)awk'{print$NF}'access.log.20220304000301

Image.png

取网卡地址

Image.png

只取个ip地址

Image.png

3)小结

行与列名称awk取行与列,指哪打哪取出网卡ip地址


4.4 swk模式匹配

谁可以作为awk的条件

awk-F"{/}+"'NR==3{print $3}'
命令选项'条件{动作}'


'模式{干啥}'


'模式{动作}'


'pattern{action}'
Image.png

1)比较表达式-参考上面取行部分

2)正则:

支持扩展正则awk可以精确到某一列,某一行中包含/不包含.....内容。~包含!~不包含

正则awk正则
^表示以....开头的行某一列的开头 $3~/^oldoy/
$表示以.....结尾的行某一列的结尾$4~/lidao$/
^$表示空行某一列是空的 很少用

#找出 第3列以2开头的行,并显示第1,3和最后一列

Image.png

找出 第3列以1或2开头的行,并显示第1列,第3列和最后一列

Image.png

还有这几种写法

Image.png

3)表示范围

/哪里开始/,/哪里结束/常用NR==1,NR==5从第1行开始到第5行结束类似于sed-n'1,5p'#显示指定时间(11:02:00到11:02:30)范围内容的ip地址和用户访问uricolumn-t(自动对齐)awk'/11:02:00/,/11:02:30/{print$1}'access.log.20220304000301awk'/11:02:00/,/11:02:30/{print$1,$7,$9,$10}'access.log.20220304000301|column-t

4)特殊模式BEGIN{}和END{}

模式含义应用场景
BEGIN{}里面的内容会在awk读取文件之执行1)进行简单统计,计算,不涉及读取文件(常见)2)用来处理文件之前,添加个表头(了解)3)用来定义awk变量(很少用,因为可以用-v)
END{}里面的内容会在awk读取文件之后执行1)awk进行统计,一般过程;先进行计算,最后END里面输出结果(常见)2)awk使用数组,用来输出数组结果。(常见)

  1. END{}统计计算:

  2. 统计方法

统计方法简写形式应用场景
i=i+1i++计数,统计次数
sum=sum+???sum+=???求和,累加
注意:i,sum都是变量

#统计/etc/services里面有多少个空行awk'/^$/'/etc/services

Image.png

统计有多少空行

awk'/^$/{i++}END{printi}'/etc/services

Image.png

#seq100求和1+2+3.。。+100awk实现seq100|awk'{sum=sum+$1}END{printsum}'

Image.png

求和显示过程

seq 100 |awk '{sum=sum+$1;print sum}END{print sum}'

Image.png

4.5 awk数组

  1. 统计日志:类似于

  2. 统计次数:统计每个ip出现次数,统计每种状态码出现次数,统计系统中每个用户被攻击的次数,统计攻击者ip出现次数

  3. 累加求和:统计每个ip消耗的流量。


shell数组awk数组
形式array[0]=oldboy array[1]=liaoarray[0]=oldboy array[1]=liao
使用echo ${array[0]} ${array[1]}print array[0] array[1]
批量输出数组内容for i in ${array[*]}do echo $idonefor(i in array) print array[i]awk数组专用循环,变量获取到的是数组的下标

#awk中字母会被识别为变量,如果只是想使用字符串需要使用双引号引起来awk'BEGIN{a[0]=oldboy;a[1]=liao;printa[0],a[1]}'

所以无结果

Image.png

数字和加双引号可以正常显示

Image.png

awk数组专用循环打印

[root@heimajinpai~]#awk'BEGIN{a[0]=12306;a[1]="liao";for(iina)printi}'01[root@heimajinpai~]#awk'BEGIN{a[0]=12306;a[1]="liao";for(iina)printa[i]}'12306liao[root@heimajinpai~]#awk'BEGIN{a[0]=12306;a[1]="liao";for(iina)printi,a[i]}'0123061liao

Image.png


案例:

http://www.etantian.org/index.htmlhttp://www.etantian.org/1.htmlhttp://post.etantian.org/2.htmlhttp://mp3.etantian.org/3.htmlhttp://www.etantian.org/4.htmlhttp://post.etantian.org/5.html[root@heimajinpaitest]#awk-F"[/]+"'{print$2}'url.txtwww.etantian.orgwww.etantian.orgpost.etantian.orgmp3.etantian.orgwww.etantian.orgpost.etantian.org[root@heimajinpaitest]#awk-F"[/.]+"'{print$2}'url.txtwwwwwwpostmp3wwwpost[root@heimajinpaitest]#awk-F"[/.]+"'{array[$2]++}END{for(iinarray)printi,array[i]}'url.txtwww3(出现的次数)mp31(出现的次数)post2(出现的次数)


#array[]++你要统计什么[]里面就是什么(某一列)awk-F"[/.]+"'{array[$2]++}END{for(iinarray)printi,array[i]}'url.txt

Image.png

#统计access.log中每种状态码出现的次数(方式一)awk'{array[$10]++}END{for(iinarray)printi,array[i]}'access.log.20220304000301|sort-rnk2
Image.png
#统计access.log中每种状态码出现的次数(方式一)awk'$10~/[0-9][0-9][0-9]/{array[$10]++}END{for(iinarray)printi,array[i]}'access.log.20220304000301|sort-rnk2
Image.png注意:使用awk统计日志,尽量精确匹配。
4.6 for循环

fornin123doecho$ndone

for(i=1;i<10;i++)do echo $idonefor(i=1;i<10;i++)print iawk for循环用来循环每个字段

#1+100[root@heimajinpainginxlog]#awk'BEGIN{for(i=1;i<=100;i++)sum+=i;printsum}'5050[root@heimajinpainginxlog]#
Image.png

4.7if 判断

Image.png

统计磁盘空间使用率,如果大于70%,则提示磁盘空间不足,并显示磁盘分区,磁盘使用率,磁盘挂载点

df-h|awk-F"[%]+"'NR>1{if($5>=70)print"disknotenough"}'

Image.png

df-h|awk-F"[%]+"'NR>1{if($5>=1)print"disknotenough",$1,$5,$NF}'

Image.png

注意:awk使用多个条件的时候 第1个条件可以放在 ‘条件{动作}’ 第2个条件 一般使用if

面试题:统计这段语句中,单词中字符小于6的单词,显示出来。

Image.png

4.9总结

Image.png

个人网站:http://www.heimajinpai.cn/wordpress/

微信公众号:黑马金牌编程


更多相关文章

  1. JavaScript 字符串常用方法和数组api
  2. 字符串api和数组api及遍历
  3. 字符串api和数组api及遍历
  4. 字符串,数组api实例演示
  5. React类组件和函数组件
  6. 字符串和数组遍历
  7. 字符串和数组常用API
  8. Android(安卓)适配器Adapter的学习
  9. android 字符串数组资源

随机推荐

  1. Ajax调用php脚本返回404错误
  2. jQuery 对Ajax的支持——从Ajax基本实现
  3. 如何将表单转换成json通过AJAX传递?
  4. 从JQuery文件输入中获取数据
  5. 模态的jQuery动态高度宽度
  6. 如何使用jQuery捕获对href值的单击
  7. 使用jquery从mysql数据库加载数据
  8. 使用Next设置选定的选项
  9. 如何在使用jquery验证和自定义错误放置时
  10. 为$ .plugin()用法准备插件而不是$(selector