awk练习

    技术2022-07-11  136

    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
    Processed: 0.012, SQL: 9