awk数据处理工具

awk是工具作用是数据过滤和数据统计 ,也是一款逐行处理工具,它与sed不同,awk不能直接用shell的变量,  awk有自己的一套语言。
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             





猜你喜欢

转载自blog.csdn.net/m0_37628356/article/details/80365245