可以实现精确搜索
awk使用方式
1,前置指令 | awk 选项 条件 指令
2,awk 选项 条件 指令 被处理文档
选项 -F 定义分隔符
指令 print 输出
内置变量 $1第1列 $2第2列 $3第3列 。。。$0所有列 NR行号 NF列号
逐行处理,天生支持扩展正则表达式!
awk '{print}' user //输出所有行
awk '/root/{print}' user //输出包含root的行
awk '/root|bin/{print}' user //输入包含root或bin的行
awk '{print $1}' user //输出所有行的第1列
awk '/root/{print $1}' user //找包含root的行,显示第1列
awk '/^bin/{print $3}' user //找以bin开头的行,显示第3列
awk '/^bin/{print $3,$1}' user //找以bin开头的行,显示第3列,第1列
awk '/^bin/{print $3,$1,$0}' user //找以bin开头的行,显示第3列,第1列,所有列
awk '/^bin/{print NR}' user //找以bin开头的行,显示该行的行号
awk '/^bin/{print NR,$0}' user //找以bin开头的行,显示该行的行号,所有列
awk '{print NF}' user //输出所有行的列号(每行有几列)
awk -F: '{print $1}' user //文档中如果没有空格,可以用F修改分隔符
awk -F: '{print $1,$6}' user //使用冒号作为列的分隔符,显示第1、6列
awk -F: '{print $1" 的家目录是 "$6}' user //还可以输出常量,加双引号即可
awk -F: '{print $1" 的解释器是 "$7}' user
收集根分区剩余容量
df -h | awk '/\/$/{print $4}' //使用df -h 作为前置指令交给awk处理
找到以/结尾的行,并输出第4列
df -h | awk '/\/$/{print "根分区剩余容量是"$4}'
收集网卡流量信息
ifconfig eth0 | awk '/RX p/{print "服务器eth0网卡的接收数据量是"$5"字节"}'
ifconfig eth0 | awk '/TX p/{print "服务器eth0网卡的发送数据量是"$5"字节"}'
------------------------------------------
三,awk中的条件
1,使用正则 ~包含 !~不包含
awk -F: '$5~/bin/{print}' user //找第5列包含bin的行
awk -F: '$5!~/bin/{print}' user //找第5列不包含bin的行
2,使用数字或者字符串
== != >= > <= <
awk -F: 'NR==1{print}' user //找第1行
awk -F: 'NR<=3{print}' user //找1~3行
awk -F: '$7=="bash"' user //找第7列等于bash的行
awk -F: '$7!="bash"' user //找第7列不等于bash的行
3,逻辑组合 && 并且 || 或者
awk -F: '$7~/bash/&&NR<=3{print}' user //找第7列包含bash并且行号是1~3的
awk -F: '$7~/bash/||NR<=3{print}' user //找第7列包含bash或者行号是1~3的
4,运算
+ - * / %
awk -F: '$3%2==0' /etc/passwd //输出id号是偶数的用户
-----------------------------------------------------------
四,awk处理时机,可以执行额外任务
BEGIN{ } 执行1次,读取文档之前执行
逐行任务 执行n次,读取文档时执行
END{ } 执行1次,读取文档之后执行
awk BEGIN{ }{ }END{ } //基本格式
------------------------------------
awk -F: 'BEGIN{print "User\tUID\tHome"}{print $1"\t"$3"\t"$6 }END{print "总计"NR"行"}' user //按下图输出信息,其中\t可以实现tab键效果,有一定的对齐功能
-
------------------------------------------
五,awk数组加for循环实现高级搜索
数组 相当于可以存储多个值的特殊变量
数组名称[下标]=下标对应的值
a[1]=10
a[2]=20
awk 'BEGIN{a[1]=10;a[2]=20;print a[2],a[1]}' //使用awk测试数组,首先创建数组a,下标1对应值是10,下标2对应值是20,然后输出下标是2与下标是1的值
awk 'BEGIN{a["aa"]="abc";a["xx"]="xyz";print a["xx"],a["aa"]}' //数组的下标与值都可以不是数字
数组用来收集信息
for循环可以循环输出数组的下标
awk 'BEGIN{a[1]=10;a[2]=20;for(i in a){print a[i]}}' //首先创建数组,定义了几个下标与对应的值,然后利用for循环,可以循环显示数组a的下标,下标都存在变量i中,最后喊出,数组中有几个下标,就会喊出几个结果
awk '{a[$1]++}END{for(i in a){print i,a[i]}}' /var/log/httpd/access_log //可以最终用来查看日志得到可以得到哪个ip来访以及来访的次数
awk '{a[$1]++}END{for(i in a){print i,a[i]}}' /var/log/httpd/access_log |sort -nr -k 2 //使用sort命令增加排序功能,-n是以数字形式排序,-r是降序, -k是指定为第几列排序
awk '/Failed password for root/{a[$11]++}END{for(i in a){print i,a[i]}}' /var/log/secure //使用awk数组+for循环收集安全日志中关于登录root账号密码错误的ip记录