awk 精确搜索

awk使用方式:

1,前置指令 | awk 选项条件指令

2awk  选项条件指令  被处理文档

选项 -F 定义分隔符 

指令print 输出

vim test.txt    //准备素材,写入下列两行内容

hello the world

welcome to beijing

awk的内置变量:  $11$22$33$0所有列  NR 行号   NF列号

awk '{print}' test.txt   //输出test所有行所有列

awk '{print $1}' test.txt  //输出test所有行第1列

awk '{print $2}' test.txt  //输出test所有行第2列

awk '/world/{print $2}' test.txt  //找到有world的行,然后输出第2列

awk '{print $0,$1}' test.txt  //找所有行的所有列和第1列

awk '{print NR}' test.txt  //输出每行的行号

awk -F: '{print $1" 的解释器是 "$7}'  user  //使用冒号作为分隔符,输出第1列,第7列,中间加常量,常量要使用双引号

利用awk提取本机的网络流量信息

ifconfig eth0 | awk '/RX p/{print "eth0网卡的接收流量是"$5"字节"}'

ifconfig eth0 | awk '/TX p/{print "eth0网卡的发送流量是"$5"字节"}'

使用awk提取根分区剩余容量

df -h | awk '/\/$/{print "根分区剩余容量是"$4}'

awk处理的时机awk除了可以执行大括号中的逐行任务,还可以安排额外的任务

BEGIN{  }  执行1次,相当于额外任务

{  } 逐行任务,执行n

END{  }  执行1次,又一个额外的任务

练习:

按下列各式要求输出信息

awk -F: ‘BEGIN{  }{  }END{  }’  user   //首先分析,写出基本各式

awk 'BEGIN{print "User\tUID\tHome"}'  //第一个是BEGIN任务就是输入表头信息,\t是制表符,相当于在文档中敲tab键,可以在一定程度上让文档自动空格排列整齐

awk -F: '{print $1"\t"$3"\t"$6}' user   //第二个是逐行任务,找到用户名,id号,家目录

awk -F: 'END{print "总计"NR"行"}' user   //最后的任务是输出一共多少行,NR是变量可以显示行号,在END任务中就是显示最后一行的行号

awk -F: 'BEGIN{print "User\tUID\tHome"}{print $1"\t"$3"\t"$6}END{print "总计"NR"行"}' user    //将上述命令敲成一行,完成需求

awk中使用精确搜索

awk中,使用好条件是能否精确输出信息的关键,awk准备了4种条件,下面一一说明。

awk中的条件有:

  1. 使用正则作为条件

~ 包含 !~ 不包含

awk -F: '/bin/{print $1}' user    //输出有bin的行的第1列

awk -F: '$5~/bin/{print $1}' user  //输出第5列包含bin的行的第1列

awk -F: '$5!~/bin/{print $1}' user  //输出第5列不包含bin的行的第1列

  1. 使用数字、字符串

==  !=  >  <  >=  <=

awk -F: 'NR==3{print}' /etc/passwd  //输出第3行

awk -F: '$3<10{print}' /etc/passwd  //输出UID小于10的行

awk -F: '$3>=1000{print}' /etc/passwd //输出UID大于等于1000的行(大于1000的用户是普通用户)

awk -F: '$7=="/bin/bash"{print}' /etc/passwd  //输出使用/bin/bash的用户

awk -F: '$7!="/bin/bash"{print}' /etc/passwd   //输出没使用/bin/bash的用户

awk -F: 'NR<11{print $1}' /etc/passwd   //查看前10行,并显示用户名

awk -F: '$7==" /bin/bash"{print $6}'  /etc/passwd //查看使用/bin/bash解释器的用户,并显示家目录

3,逻辑组合  &&并且   ||或者

awk -F: '$3<10&&$7~/bash/{print}' /etc/passwd  //找第3列小于10并且第7列包含bash的行,{print}可以省略

awk -F: '$3>=10&&$3<=20{print}' /etc/passwd  //找第3列大于等于10并且小于等于20的行

awk -F: 'NR>=2&&NR<=10{print}' /etc/passwd  //找2~10行

awk -F: '$3<5||$3>1000{print}' /etc/passwd  //找id号是小于5的或者大于1000的 

4,使用运算作为条件

seq 200 | awk '$1%7==0&&$1~/7/{print}'   //在一个有200行从1~200的数字序列的文档中找能被7整除的行,并且包含7

---------------------------------------------------------------------------------------

awk中使用if分支

单分支,如果满足条件就执行指令,不满足就不执行任何指令

{if (条件){指令}}

awk -F: 'BEGIN{x=0}{if($7~/bash/){x++}}END{print x}' /etc/passwd  //首先定义变量x=0,然后使用if判断如果每找到一行的$7包含bash,就把x+1,所有逐行任务结束后,最终使用end任务输出x的值,也就是找系统中使用bash作为解释器的用户数量

双分支,如果满足条件就执行指令,不满足就执行else后面的指令

{if (条件){指令}else{指令}}

awk -F: 'BEGIN{x=0;y=0 }{if($7~/bash/){x++}else{y++}}END{print x,y}' /etc/passwd  //统计系统中使用bash作为解释器的用户,和没有使用bash的用户数量,使用if判断如果每找到一行的$7包含bash,就把x+1,否则y+1,最后使用end输出x与y的值

多分支

{if (条件){指令}else if (条件){指令}else{指令}}

awk -F: '{if($7~/bash/){x++}else if($7~/nologin/){y++}else{z++}}END{print x,y,z}' /etc/passwd  //统计系统中使用bash作为解释器的用户,使用nologin的用户,还有其他用户的数量

------------------------------------------------------------------------------------------------

数组,相当于可以存储多个值的特殊变量

数组名[下标]=该数组下标对应的值

a[1]=10

a[2]=20

awk中使用for循环遍历数组

for(变量名称 in 数组名称){print 变量名称}

基本用法示例1

awk 'BEGIN{a[1]=10;a[2]=20;for(i in a){print i}}'   //首先创建数组,名字叫a,并且有1与2两个下标,还有对应的10与20两个值,然后为了方便查看该数组中所有内容,使用了for循环,可以循环显示所有数组a的下标,然后输入变量i,此时的变量i就可以分别显示数组a的所有下标

基本用法示例2

awk 'BEGIN{a[1]=10;a[2]=20;for(i in a){print a[i]}}'   //定义好了数组之后,循环显示数组的值

awk 'BEGIN{abc["a"]="aaa";abc["b"]="bbb";abc["c"]="ccc";for(i in abc){print i,abc[i]}}'   //定义好了数组之后循环显示数组的下标与值

基本用法示例3

准备素材

vim shu.txt

abc

Xyz

Opq

abc

abc

xyz

wk '{a[$1]++}END{for (i in a){print i,a[i]}}' shu.txt

处理日志时:

-------------------------------------

使用awk的数组进行逐行任务时收集数据的思路过程:

abc     a[abc]   a[abc]=1

xyz        a[xyz]   a[xyz]=1

opq     a[opq]   a[opq]=1

abc     a[abc]    a[abc]=2

abc     a[abc]    a[abc]=3

xyz        a[xyz]    a[xyz]=2

---------------------------------------------------------------------------------

实际应用1

使用awk统计网站访问量

yum -y remove httpd  //如果httpd有问题可以先删除

yum -y install httpd     //安装httpd

systemctl restart httpd  //开启服务

netstat -ntulp | grep :80  //查询当前80端口状态

echo "web_test~~~~" > /var/www/html/index.html   //定义网站页面

yum -y install curl  //安装curl工具

curl 192.168.4.7  //查看网站内容,防火墙要关闭

cd /var/log/httpd  //进入httpd日志目录

tail -1 access_log  //查看httpd日志的最后一行,也就是最新记录,然后多用不同主机访问该网站,可以让该日志多产生记录

awk '{ip[$1]++}END{for(i in ip){print ip[i],i} }' access_log  //创建数组名叫ip,下标匹配日志文件中每行的第1列,然后收集数据,也就是收集那些ip地址曾经访问过你的网站,最后在END任务中使用for循环显示这些用户的访问次数与ip

用sort进行排序,-n是以数字

实际应用2

使用awk统计多少ip曾经尝试登陆你的服务器

awk '/Failed pas/{ip[$11]++}END{for(i in ip){print ip[i],i} }' /var/log/secure   //找到安全日志secure中含有Failed pas的行,该行表示有用户登录服务器时输入错误了密码,从该行的第11列可以筛选出对方的ip,并通过数组进行收集,然后通过for循环显示有多少ip(人)尝试登录过几次我的服务器

 

  • 37
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值