- 统计/etc/fstab文件中每个文件系统类型出现的次数
awk '/^UUID/{fs[$3]++}END{for(i in fs){print i,fs[i]}}' /etc/fstab
/^UUID/:模式匹配以UUID开头的行
fs[$3]++:定义fs[]为关联数组下标是每条记录的第3个字段,数组的值是出现的次数
for(i in fs){print i,fs[i]}:在每条记录都处理完之后,用for循环遍历数组,打印下标(文件类型)和数组元素值(文件类型出现的次数)
- 统计/etc/fstab文件中每个单词出现的次数
awk '{i=1;while(i<=NF){word[$i]++;i++}}END{for(num in word){print num,word[num]}}' /etc/fstab
用while循环处理每条记录的每个字段,最主要的是每处理完一个字段要把i置为一,这样每处理完一个记录,关联数组被下一个记录的每个字段重新赋值
- 提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字
echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" | awk 'gsub(/[^[:digit:]]/,"",$0)'
gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容,模式匹配用的是扩展正则表达式
- 解决DOS攻击生产案例:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔5分钟。防火墙命令为: iptables -A INPUT -s IP -j REJECT(access_log为apache访问日志)
定时监控可以写到计划任务里,这里只实现awk过滤
awk '{access[$1]++}END{for(i in access){if(access[i]>=100){print i,access[i]}}}' access_log
- 计算男生女生的总成绩,平均成绩
[root@centos7 ~]# cat 1.txt
mage 100 male
wang 90 male
zhang 80 female
li 100 female
[root@centos7 ~]# awk '{if($3=="male"){mscore+=$2;mtotal++}else{fscore+=$2;ftotal++}}END{print mscore,mscore/mtotal,fscore,fscore/ftotal}' 1.txt
- 取出Foreign Address
[root@centos7 ~]# netstat -ntl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN
tcp6 0 0 :::111 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:631 :::* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
tcp6 0 0 ::1:6010 :::* LISTEN
# netstat -ntl | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print i,count[i]}}'
关于AWK详细说明请点击这里