三剑客之awk

发布于:2022-08-08 ⋅ 阅读:(572) ⋅ 点赞:(0)

擅长对列进行处理,可以完成信息的统计。

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/fstab

3、提取出字符串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