awk案例练习

目录

一、awk练习

1.1筛选ip地址

1.2字段去重

1.3次数统计

1.4统计TCP连接状态

1.5处理字段缺失的数据

1.6筛选给定时间范围内的日志

一、awk练习

1.1筛选ip地址

ifconfig命令查看IP

利用awk进行筛选

复制代码
ifconfig  | awk 'BEGIN{RS=""}NR=2{print $6}'

RS指定输入记录换行符,当RS=""时,即输入换行符为\n,它指示AWK将连续的非空行组合成一个记录,这时就分为了三行,每一段一行,NR==2,代表第二行也就是第二段,$6代表第二行的以空格为间隔的第6个字段,也就是ip地址

1.2字段去重

先随便创建个test练习,将下面内容写进去

2019-01-13_12:00_index?uid=123

2019-01-13_13:00_index?uid=123

2019-01-13_14:00_index?uid=333

2019-01-13_15:00_index?uid=9710

2019-01-14_12:00_index?uid=123

2019-01-14_13:00_index?uid=123

2019-01-15_14:00_index?uid=333

2019-01-16_15:00_index?uid=9710

利用awk命令进行去重

复制代码
awk -F"?" '{arr[$2]++;if(arr[$2]=1){print $0}}'  test  

-F"?"代表以?为输入字段分隔符,arr$2即arruid=xxx

当字段第一次出现时,arr$2为0,++后为1,触发if条件,输出$0;

当字段第二次及n次出现时,arr$2已经等于1了,++后为2,无法触发if条件,无法输出

这样就达到了去重的效果

1.3次数统计

依旧随意创建文本test

复制代码
status
status
mountd
mountd
mountd
mountd
mountd
mountd
k8s
k8s
k8s
nfs
k8s
nfs
nfs_acl
nfs
nginx
nginx
nginx
docker
docker
docker
nfs_acl
nlockmgr
nlockmgr
nlockmgr
nlockmgr

status
status
mountd
mountd
mountd
mountd
mountd
mountd
k8s
k8s
k8s
nfs
k8s
nfs
nfs_acl
nfs
nginx
nginx
nginx
docker
docker
docker
nfs_acl
nlockmgr
nlockmgr
nlockmgr
nlockmgr
nlockmgrr
nlockmgstatus

利用cat 与awk 统计出现的次数

当字段第一次出现时,arr$0=0,++后为1,当出现第二次时,arr$0=1,++后为2,所以当第n次出现时,arr$0=n

END表示最后的操作,for(i in arr){print arri, i}表示打印键值和键名,即第一行的4 nfs

复制代码
cat test | awk '{arr[$0]++}END{for(i in arr){print arr[i],i}}'

1.4统计TCP连接状态

先用netstat -lntp查看

再用以下命令统计

复制代码
netstat -lntp | awk 'NR>2{arr[$6]++}END{for(i in arr){print arr[i],i}}'

NR>2代表处理大于第二行的记录,arr$6++代表统计tcp连接状态的次数,最后打印出来

1.5处理字段缺失的数据

在test中随意输入一些数据

复制代码
ID  name    gender  age  email          phone
1   Bob     male    28   abc@qq.com     18023394012
2   Alice   female  24   def@gmail.com  18084925203
3   Tony    male    21                  17048792503
4   Kevin   male    21   bbb@189.com    17023929033
5   Alex    male    18   ccc@xyz.com    18185904230
6   Andy    female       ddd@139.com    18923902352
7   Jerry   female  25   exdsa@189.com  18785234906
8   Peter   male    20   bax@qq.com     17729348758
9   Steven          23   bc@sohu.com    15947893212
10  Bruce   female  27   bcbd@139.com   13942943905

awk '{print $6}' test

这里如果想打印电话,直接打印6是不行的,因为有些记录是没有6的,所以可以通过if条件,判断如果5是以0-9开头的,那就打印5,否则就打印$

复制代码
 awk '{if($5 ~ /^[0-9]/){print $5}else{print $6}}' test

1.6筛选给定时间范围内的日志

随便找的之前的防火墙日志

是"-F-"以短横线为字段分隔符,使用if判断来输出一月份的日志

复制代码
 awk -F- '{if($2<=1){print $0}}' test
相关推荐
AlfredZhao9 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户97183563346615 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪17 小时前
linux 拷贝文件或目录到指定的位置
linux
大树881 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
小宇宙Zz1 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工1 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信