awk 选项 ‘条件 {指令}’ 文件 #简单版
awk 选项 'BEGIN{指令} 条件{指令} END{指令}' 文件 #完全体 只有中间的逐行执行,其他对文件前执行,和后执行 。
awk最大的优势就是列处理功能!
这里直接上案例如果取passwd中以bash结尾的用户,使用sed工具就需要一个字符的截取
for i in `sed -n "/bin\/bash$/p" /root/passwd`
do
echo ${i%%:*} >> usertxt
done
这里用awk
awk -F : '$7~/bash/{print $1}' /etc/passwd
内置变量:NF代表列数 NR代表行数 $n代表各列 $NF最后一列
选项:-F指定列的分割符 -v这个就是将shell中的值赋予一个变量到awk中使用 例如:-v x=$i
条件:1.和sed一样支持扩展正则(不能调用变量)
2.支持字符数字比较(可以用变量) ~包含 !~不包含 ==完全匹配 !=不匹配 = >= <= > <
3.支持逻辑比较 && ||
指令:print打印
这里来个计算器功能awk
awk 'BEGIN{print 1+2*3}' bc计算器就是awk做的
统计系统中普通用户的数量
awk -F : '$3>=1000{i++} END{print i}' /etc/passwd
统计100中包含7或者7的被数的数
seq 100 | awk '$1~7||$1%7==0{print $1}' 这里写个或
awk指令if while for结构与shell的格式不同
if统计系统中普通用户和系统用户个数使用if结构一条解决
awk -F: '{if($3>=1000){x++}else{y++}}END{print x,y}' /etc/passwd
while统计词频,这个就比较难分析下,awk是列处理工具,但是一个文件中列数不固定阿,有10列有5列。
这个时候就可以使用while和if两个语法,while限制列数,if词匹配,匹配成功++
统计/etc/passwd下的root的出现次数
awk -F: '{i=1;while(NF>=i){if($i~"root"){x++};i++}}END{print x}' /etc/passwd 可以当公式
这个 解析以下以:为分隔符定义一个变量i=1,写个while循环对当前所在第几列做判断如果大于文本中最大列数停止循环,
套个if来判断这行这列列的值是否包含root,包含就x+1,到这里if结束. i+1表示到第二列进行if匹配欧克了。
awk数组应用
awk 'BEGIN{a[0]="2";a[1]="3";print a[0]} ' 输出2
重点应用:数据的统计 对于网络中的攻击 我们需要检索出源ip并加入防火墙,但是呢日志文件的数据多到看不过来
我们这个时候引用一个变量ip使用数组来存储ip地址出现的次数 ip【172.16.0.1】=3 ip【10.0.1.2】=4
第一步这个下角标做ip,可以通过++来增加这个值
'{ip[$1]++}' 这里$1就是文件中ip地址那一行,出现一次就加1,逐行处理
这样就会生成变量ip有好多不同ip值的下角标。
第二步 如何显示这些值
for i in ip 这里的awk工具for的结构调用的是变量的下角标~和shell不同
awk '{IP[$1]++}END{for(i in ip){print i,IP[i]}} /var/log/.....
ok
解析:定义变量IP,把出现的ip地址都作为IP的角标存储,逐行处理时出现一次加一次,最后使用for把i用来调用IP的角标
IP[i]表示出现的次数。
i IP【i】
172.25.0.1 10000
10.20.2.1 5555