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*RANDOM%100000] ;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|