awk练习

1.文件ip_list.txt如下格式,请提取“.magedu.com”前面的主机部分并出入回到该文件中
    1 blog.magedu.com
    2 www.magedu.com
    ....
    999 study.magedu.com

解法:
awk -F '[ .]' '{print $2}' ip_list.txt  >> ip_list.txt

2.统计/etc/fstab文件中每个文件系统类型出现的次数
文件内容:


#
# /etc/fstab
# Created by anaconda on Wed Apr 24 21:34:19 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=3a3ed56a-b439-4fe9-951a-3c39a8fc9ece /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/sdb1              /data                    xfs     defaults        0 0

解法:
~]# awk  '/^\/dev|^UUID/{file_type[$3]++}END{for(i in file_type){print file_type[i],i}}' /etc/fstab
1 swap
4 xfs

注解:
(1)/^\/dev|^UUID/ 用来筛选以/dev或者UUID开头的行,因为存在/,所以需要用\进行转义
(2)file_type[$3]是把文件类型作为索引数组,然后重复重复出现的文件类型会让索引对应的值递增。
(3)for(i in file_type)是为了循环数组,把属组的索引和值都提出来展示。


3.统计/etc/fstab文件中每个单词出现的次数
解法:
~]# awk -F '[^[:alnum:]]+'  '!/^$/{i=1;while(i<=NF){if($i ~ /[[:alnum:]]+/)word[$i]++;i++}}END{for(j in word){print word[j],j}}' /etc/fstab | sort -nr
10 0
5 dev
5 defaults
4 xfs
3 swap
3 mapper
3 centos
3 8
2 home
2 fstab
2 by
1 Wed
1 UUID
1 under
1 See
1 sdb1
1 root
1 reference
1 pages
1 or
1 on
1 mount
1 more
1 man
1 maintained
1 info
1 for
1 findfs
1 filesystems
1 etc
1 disk
1 data
1 Created
1 boot
1 blkid
1 b439
1 are
1 Apr
1 and
1 anaconda
1 Accessible
1 951a
1 5
1 4fe9
1 3c39a8fc9ece
1 3a3ed56a
1 34
1 24
1 21
1 2019
1 19

注解:
(1)-F '[^[:alnum:]]+' 代表以任何非数字或非字母的符号作为分隔符
(2)!/^$/ 这个意思是排除空行
(3)i=1;while(i<=NF)这个循环每一行里面的所有列
(4)$i ~ /[[:alnum:]]+/ 这个代表当列匹配为数字或者字母时
(5)word[$i]++ 创建属组,以数字或字母为索引,以出现的次数为值
(6)END{for(j in word){print word[j],j}} 循环属组,得到每个单词出现和出现的次数

4.提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字
方法1:
echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" | egrep -o '[[:digit:]]'

方法2:
~]# echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" | sed -n  's#[^0-9]##gp'
05973

方法3:
echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" | awk  -F '[^0-9]' '{i=1;while(i<=NF){if($i ~ /[[:digit:]]/)printf"%s",$i;i++}}'

5、有以文件记录了1-1000000之间随机的整数共5000个,存储的格式100,50,35,89...请取出其中最大和最小的整数
解法:
]# awk -F, '{i=1;max=$i;min=$i;while(i<=NF){if($i>max)max=$i;else if($i<min)min=$i;i++}}END{printf "max:%s   min:%s\n",max,min}' num.txt
max:4343   min:10

6、解决DOS攻击生产案例:根据web日志或者或者网络连接数,监控当某个IP 并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频 率每隔5分钟。防火墙命令为:iptables -A INPUT -s IP -j REJECT
1>编辑脚本
vim ddos.sh
ss -ant |awk -F ' +|:' '/ESTAB/{ip[$6]++}END{for(i in ip)if(ip[i]>=100){system("iptables -A INPUT -s "i " -j DROP")}}'
2>增加脚本权限
chmod +x ddos.sh
3>设置定时任务
*/5 * * * * /opt/ddos.sh

7.将以下文件内容中FQDN取出并根据其进行计数从高到低排序
https://mail.magedu.com/index.html
https://www.magedu.com/test.html
https://stduy.magedu.com/index.html
https://blog.magedu.com/index.html
https://www.magedu.com/imagex/logo.jpg
https://blog.magedu.com/20080102.html

解法:
]# awk -F '/' '{fqdn[$3]++}END{for(i in fqdn){print fqdn[i],i}}' awk.sh  | sort -nr
2 www.magedu.com
2 blog.magedu.com
1 stduy.magedu.com
1 mail.magedu.com

8.计算男女生的平均成绩
原始文档:
name gender score
a     m        100
b     f         99
c     f      98
d     m       80

解法:
]# awk 'NR>1{gen[$2]++;score[$2]+=$3}END{for(i in gen){print i,score[i]/gen[i]}}' score.txt
m 90
f 98.5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值