Linux 练习 - 文本处理三剑客之AWK

    技术2022-07-10  120

    1、文件 ip_list.txt 如下格式,请提取 ”.solin.com” 前面的主机名部分并写入到回到该文件中

    1 blog.solin.com

    2 www.solin.com

    999 study.solin.com

    [root@centos7 ~]# awk -F "[ .]" '{print $2}' ip_list.txt >> ip_list.txt
    2、统计 /etc/fstab 文件中每个文件系统类型出现的次数
    [root@centos7 ~]# awk '/^UUID/{fs[$3]++}END{for(i in fs){print i,fs[i]}}' /etc/fstab swap 1 xfs 2
    3、统计 /etc/fstab 文件中每个单词出现的次数
    [root@centos7 ~]# awk -F "[)( /=',-]" '{for(i=1;i<=NF;i++){if($i ~ "\\<[[:alpha:]]+\\>"){word[$i]++}}}END{for(i in word){print word[i],i}}' /etc/fstab | sort -nr[root@centos7 ~]# awk -F "[)( /=',-]" '{for(i=1;i<=NF;i++){if($i ~ "\\y[[:alpha:]]+\\y"){word[$i]++}}}END{for(i in word){print word[i],i}}' /etc/fstab | sort -nr
    4、提取出字符串 Yd$C@M05MB%9&Bdh7dq+YVixp3vpw 中的所有数字
    [root@centos7 ~]# echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" | awk '{gsub(/[^0-9]/,"",$0);print $0}' 05973
    5、有一文件记录了 1-100000 之间随机的整数共 5000 个,存储的格式 100,50,35,89… 请取出其中最大和最小的整数
    [root@centos7 ~]# for(( i=1;i<=5000;i++ ));do echo $[$RANDOM*RANDOM0000] ;done > numbers.txt [root@centos7 ~]# awk -F, '{max=$1;min=$1;for(i=1;i<NF;i++){if($i>max){max=$i}else{if($i<min){min=$i}}}}END{print "最大值:"max,"最小值:"min}' numbers.txt 最大值:99966 最小值:16
    6、解决 DOS 攻击生产案例:根据 web 日志或者或者网络连接数,监控当某个 IP 并发连接数或者短时内 PV 达到 100,即调用防火墙命令封掉对应的 IP,监控频率每隔 5 分钟。防火墙命令为:iptables -A INPUT -s IP -j REJECT
    脚本 #!/bin/bash ss -nt | awk -F " +|:" '{ip[$4]++}END{for(i in ip){if(ip[i]>100){system("iptables -A INPUT -s "i" -j REJECT")}}}' 任务计划 # 授权 [root@centos7 ~]# chmod+x /root/dos.sh # 设置 [root@centos7 ~]# crontab */5 * * * * /bin/bash /root/dos.sh # 查看 [root@centos7 ~]# crontab -l */10 * * * * /bin/bash /root/dos.sh
    7、将以下文件内容中FQDN取出并根据其进行计数从高到低排序

    http://mail.solin.com/index.html

    http://www.solin.com/test.html

    http://study.solin.com/index.html

    http://blog.solin.com/index.html

    http://www.solin.com/images/logo.jpg

    http://blog.solin.com/20080102.html

    [root@centos7 ~]# cat fqdn.txt http://mail.solin.com/index.html http://www.solin.com/test.html http://study.solin.com/index.html http://blog.solin.com/index.html http://www.solin.com/images/logo.jpg http://blog.solin.com/20080102.html [root@centos7 ~]# awk -F"[/.]" '{fqdn[$3]++}END{for(i in fqdn){print fqdn[i],i}}' fqdn.txt | sort -rn 2 www 2 blog 1 study 1 mail
    8、将以下文本以 inode 为标记,对 inode 相同的 counts 进行累加,并且统计出同一 inode 中,beginnumber 的最小值和 endnumber 的最大值

    inode|beginnumber|endnumber|counts|

    106|3363120000|3363129999|10000|

    106|3368560000|3368579999|20000|

    310|3337000000|3337000100|101|

    310|3342950000|3342959999|10000|

    310|3362120960|3362120961|2|

    311|3313460102|3313469999|9898|

    311|3313470000|3313499999|30000|

    311|3362120962|3362120963|2|

    输出的结果格式为:

    310|3337000000|3362120961|10103|

    311|3313460102|3362120963|39900|

    106|3363120000|3368579999|30000|

    [root@centos7 ~]# cat inode.txt inode|beginnumber|endnumber|counts| 106|3363120000|3363129999|10000| 106|3368560000|3368579999|20000| 310|3337000000|3337000100|101| 310|3342950000|3342959999|10000| 310|3362120960|3362120961|2| 311|3313460102|3313469999|9898| 311|3313470000|3313499999|30000| 311|3362120962|3362120963|2| [root@centos7 ~]# awk -F"|" -v OFS="|" 'NR!=1{count[$1]+=$4; \ > if(min[$1]>$2 || !min[$1]){min[$1]=$2};if(max[$1]<$3 || !max[$1]){max[$1]=$3}} \ > END{for(i in count){print i,min[i],max[i],count[i]"|"}}' inode.txt 310|3337000000|3362120961|10103| 311|3313460102|3362120963|39900| 106|3363120000|3368579999|30000|
    Processed: 0.012, SQL: 9