文本处理三剑客之awk
awk 是一个文本处理工具,通常用于处理数据并生成结果报告。
awk 的工作模式和 sed 类似,也是逐行读取,逐行处理。
1 | awk [-W option] [-F value] [-v var=value] [--] 'program text' [file ...] |
语法格式
1 | awk 'BEGIN{commands}pattern{commands}END{commands}' file |
- BEGIN{commands}:正式处理文本之前执行,可以省略
- END 后{commands}:处理完所有文本后执行,可以省略
- pattern{commands}:逐行执行,pattern 判断此行是否符合匹配模式,符合则执行{commands}
- pattern:匹配模式,可以省略
- {commands}:对每行执行的命令,这里面可以写判断、循环等语句,功能强大,所以 awk 又被称为 awk 编程。不可省略
内置变量
1 | $0 # 整行内容 |
格式化输出 printf
格式符
1 | %s # 打印字符串 |
修饰符
1 | - # 左对齐 |
模式匹配
第一种模式匹配:正则表达式 RegExp
第二种模式匹配:关系运算符号匹配
<、>、<、>=、!=:匹配正则表达式:不匹配正则表达式
!
||:或
&&:与
!:非
表达式
+、-、、/、%、^或*、++x、x++、–x、x–
-x:转换为负数
+x:将字符串转换为数值
条件语句
注:awk 中语句块没有作用域,都是全局变量。
1 | if(条件表达式) |
1 | switch (expression) { |
循环语句
1 | while(条件表达式) |
1 | do |
1 | for(i=0; i<100, i++) |
continue 和 break
continue 跳过本次循环,break 跳出整个循环
next
next 可以提前结束对本行处理而直接进入下一行处理(awk 自身循环)
1 | [root@centos8 ~]#awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd |
awk 内置函数
算数函数
rand:返回 0-1 之间一个随机数,需要配合 srand()配合生成随机数种子
1
[root@centos8 ~]#awk 'BEGIN{srand();print rand()}'
int:返回整数
字符串函数
length
index
tolower
toupper
substr
split
match
sub
gsub
时间函数
mktime:生成时间戳
strftime:将时间戳转化格式化时间输出
1
strftime("%Y-%m-%dT%H:%M",systime()) ;
systime:获取当前时间戳
其他函数
next:提前结束本行处理,进入下一行处理
system:system(commands),在 awk 中调用 shell 命令
exit
终止脚本执行
常用选项
1 | -v # 参数传递 |
数组
shell 中数组的下标从 0 开始,awk 中数组下标从 1 开始,而且也有关联数组。但每次只能定义元素。如果想一次性定义多个元素,可以通过 split 间接实现。
1 | str="a b c d e" |
++
awk 中,数组[键]++ 表示给数组的元素赋值,赋值+1。灵活运用,可以实现去重、统计的功能
1 | arr[a]=1 |
范例:显示主机的连接状态出现的次数
1 | awk 'NR!=1{print $1}' ss.log |sort |uniq -c |
awk
脚本
将 awk 写成脚本,调用或直接执行
范例:调用
1 | [root@centos8 ~]#cat passwd.awk |
范例:直接执行
1 | [root@centos8 ~]#cat test.awk |
练习:
检查出最近一小时内访问 nginx 服务次数超过 3 次的客户端 IP
1 |
1、文件 host_list.log 如下格式,请提取”.magedu.com”前面的主机名部分并写入到回到该文件中
1 | 1 www.magedu.com |
2、统计/etc/fstab 文件中每个文件系统类型出现的次数
3、统计/etc/fstab 文件中每个单词出现的次数
4、提取出字符串 Yd$C@M05MB%9&Bdh7dq+YVixp3vpw 中的所有数字
5、有一文件记录了 1-100000 之间随机的整数共 5000 个,存储的格式 100,50,35,89…请取出其中最大和最小的整数
6、解决 Dos 攻击生产案例:根据 web 日志或者或者网络连接数,监控当某个 IP 并发连接数或者短时内 PV 达到 100,即调用防火墙命令封掉对应的 IP,监控频率每隔 5 分钟。防火墙命令为:iptables -AINPUT -s IP -j REJECT
7、将以下文件内容中 FQDN 取出并根据其进行计数从高到低排序
1 | http://mail.magedu.com/index.html |