擅长对列进行处理,可以完成信息的统计。
1、命令使用说明
# ceshi.txt文件
01 oldboy 15829206244 dev 10000;2000;1000
02 oldgirl 15829206248 ops 16000;2000;1000
03 olddog 15829206245 java 13000;2000;1000
04 oldfinal 15829206249 php 20000;2000;1000
05 oldman 15829206254 dev 18000;2000;1000
06 oldwoman 15829206242 dev 15000;2000;1000
1.1 查询操作
(1)查询包含oldboy的行
awk '/oldboy/' ceshi.txt
(2)根据行号查询指定行
awk 'NR==2' ceshi.txt
(3)查询指定行指定列的信息
awk 'NR==2 {print $2,$3}' ceshi.txt
(4)显示oldboy的姓名和电话号码
awk '$2~/oldboy/{print $2,$3}' ceshi.txt
(5)显示姓名为oldgirl的工资和补贴
awk -F '[ ;]+' '/oldgirl/{print $2,$5,$6}' ceshi.txt
(6)显示电话号码以15开头的人的姓名和电话
awk '$3~/^15/print{$2,$3}' ceshi.txt
(7)显示电话号码以8或9结尾的电话号码
awk '$3~/8$|9$/print{$3}' ceshi.txt
(8)显示所有人员的薪资,并在薪资前面加上¥符号
awk -F '[ ;]+' '{print "¥"$5}'
(9)内容取反,查找出不包含oldboy的行
awk '2$!~/oldboy/' ceshi.txt
1.2 特殊操作
1、统计/etc/fstab文件中每个文件系统类型出现的次数
awk '!/^$/ && $1!="#"{fs[$3]++}END{for(i in fs){print i,fs[i]}}' /etc/fstab注释:
!/^$/:删除空白行2、统计/etc/fstab文件中每个单词出现的次数
awk '{i=1;while(i<=NF){word[$i]++;i++}}END{for(num in word){print num,word[num]}}' /etc/fstab3、提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字
echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" | awk 'gsub(/[^[:digit:]]/,"")'gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容,模式匹配用的是扩展正则表达式
4、解决DOS攻击生产案例:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔5分钟。防火墙命令为: iptables -A INPUT -s IP -j REJECT(access_log为apache访问日志)
awk '{access[$1]++}END{for(i in access){if(access[i]>=100){print i,access[i]}}}' access_log