目录
一、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]即arr[uid=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
nlockmgrstatus
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 arr[i], 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