一:awk 简介
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据的分析并生成报告时显得尤为强大,简单说就是awk把文件逐行读入,以空格为默认分隔符,将每行切片,切开的部分再进行分析处理,因为切开的部分使用awk可以定义变量,运算符,流程控制语句进行深度加工与分析。
awk分解行记录,获取每一个域的记录
域:根据指定符号,把一行记录分解成多个小记录,每个小记录成为域,记录:一行数据
awk 分解记录:
1.awk -F 分解符号
2.awk 默认按照""分解
awk 获取每个域值:
$0:获取一行记录(所有域)
$1:获取第一个域的值
$2:获取第二个域的值
$n:获取第n个域的值
awk 语句组成部分:
1.BEGIN :表头
2.表的数据
3.END:表尾
[root@host ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@host ~]# awk 'BEGIN{print 1/2} {print "ok"} END{print "-------------"}' /etc/hosts
0.5
ok
ok
-------------
/etc/hosts文件有两行,所以就输出了两次ok
BEGIN{} | {} | END{} |
---|---|---|
行处理前 | 行处理 | 行处理后 |
awk有许多内置变量用来设置环境信息,常用的有:
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk读取的文件名
FNR 当前文件已处理的记录行数
FS 设置域分隔符,相当于-F
NF 域的列数 $NF标识最后处理域
NR 迄今为止看到的输入记录总数
OFS 设置输出字段域分隔符
RS/ORS 换行符
二:案例
1、统计/etc/passwd中各类型shell的数量
/etc/passwd的内容上图,就是要统计出最后一个域每种类型的数量
[root@host ~]# awk -F: '{shells[$NF]++} END{for (i in shells) {print i,shells[i]}}' /etc/passwd
/bin/sync 1
/bin/bash 1
/sbin/nologin 16
/sbin/halt 1
/usr/sbin/nologin 3
/sbin/shutdown 1
{shells[$NF]++} 是行处理, END{for (i in shells) {print i,shells[i]}}就是行处理后进行统计
2、统计日志中每个ip出现的次数
有一个日志文件第一列就是ip地址,统计22/Jun/2022的每个ip出现的次数
[root@master1 test]# awk '/22\/Jun\/2022/{ips[$1]++} END{for (i in ips){print i,ips[i]}}' /data/imobile/nginx/logs/access.log |sort -k2rn
117.61.240.199 24
167.94.138.45 2
54.156.67.211 2
101.89.29.78 1
124.70.74.250 1
18.234.206.160 1
34.207.238.68 1
34.230.69.70 1
3.81.16.35 1
3.86.206.207 1
3.91.74.213 1
44.202.69.104 1
54.172.65.245 1
54.172.77.42 1
54.198.116.147 1
54.82.214.189 1
61.151.178.180 1
sort -k2rn :就是按第二列排序