使用awk统计分析

awk是一个强大的文本分析工具,它能按行读取文件,以空格或自定义分隔符分割每行,并对每个域进行处理。文章介绍了awk的基本用法,如BEGIN和END块,以及如何通过$0,$1等获取域值。还提供了两个案例,分别是统计/etc/passwd中各类型shell的数量和日志文件中每个IP的出现次数,展示了awk在数据分析中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一: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 :就是按第二列排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

javascript_good

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值