一 . awk工具概述
awk编程语言/数据处理引擎
创造者:Aho、Weinberger、Kernighan
基于模式匹配检查输入文本,逐行处理并输出
通常用在shell脚本中,获取指定的数据
单独用时,可对文本数据做统计
命令格式解析
主要用法
格式1:前置命令 | awk [选项] '[条件]{指令}'
格式2:awk [选项] '[条件]{指令}' 文件...
常用命令选项
-F :指定分隔符,可省略(默认空格或Tab)
二 . 使用awk提取文本
2.1 实例1 (直接过滤文件内容)
[root@client ~]# cat awktest.txt hello the world this is shanghai [root@client ~]# awk '{print $1,$3}' awktest.txt hello world this shanghai
2.2 实例2 (打印磁盘剩余空间)
[root@client ~]# df -h | awk '{print $4}' 可用 14G 897M 912M 903M 912M 0 836M 183M 183M
2.3 实例3 (输出passwd文件中以分号分隔的第1、7个字段,显示的不同字段之间以逗号隔开)
[root@client ~]# awk -F: '{print $1,$7}' /etc/passwd root /bin/bash bin /sbin/nologin daemon /sbin/nologin adm /sbin/nologin lp /sbin/nologin ... ...
2.4 实例4 (awk的print指令不仅可以打印变量,还可以打印常量)
[root@svr5 ~]# awk -F: '{print $1,"的解释器:",$7}' /etc/passwd [root@svr5 ~]# awk -F: '{print $1,"的解释器:",$7}' /etc/passwd root 的解释器: /bin/bash bin 的解释器: /sbin/nologin … …
2.5 实例5 (提取网卡信息中RX bytes与TX bytes)
[root@client ~]# ifconfig ens33 | awk '/RX p/{print $5}' 85570 [root@client ~]# ifconfig ens33 | awk '/TX p/{print $5}' 94377
三 . awk过滤的时机
在所有行前处理,BEGIN{ }
读入第一行文本之前执行
一般用来初始化操作
逐行处理,{ }
逐行读入文本执行相应的处理
是最常见的编辑指令块
在所有行后处理,END{ }
处理完最后一行文本之后执行
一般用来输出处理结果
3.1 实例1
[root@client ~]# awk 'BEGIN {a=35;print a+12}' 47
3.2 实例2 (统计系统中使用bash作为登录Shell的用户总个数)
[root@client ~]# awk 'BEGIN{x=0}/bash$/{x++} END{print x}' /etc/passwd 5
四 . awk处理时机
4.1 正则表达式
实例1
[root@client ~]# awk -F: '/^ro/{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash
实例2
[root@client ~]# awk -F: '$7!~/bash$/{print $1,$7}' /etc/passwd bin /sbin/nologin daemon /sbin/nologin adm /sbin/nologin lp /sbin/nologin sync /bin/sync shutdown /sbin/shutdown
4.2 数值比较
==等于、!=不等于
>大于、>=大于或等于
<小于、<=小于或等于
实例1
[root@client ~]# cat awkreg.txt abcd xx xx abcabcd xx [root@client ~]# awk 'NR==2{print}' awkreg.txt //输出第二行文本 xx [root@client ~]# awk '$2!="xx"{print}' awkreg.txt //输出第二列不是xx的行 xx [root@client ~]# awk 'NF>=2{print}' awkreg.txt //输出包含2个及以上字段的行 abcd xx abcabcd xx
4.3 逻辑比较测试
&& 逻辑与:期望多个条件都成立
|| 逻辑或:只要有一个条件成立立即满足要求
实例
[root@client ~]# awk -F:'$3>=0&&$3<2{print$1,$3}' /etc/passwd //列出UID小于2的用户信息 root 0 bin 1 [root@client ~]# awk -F:'$3==1||$3==7{print$1,$3}' /etc/passwd //列出UID为1或7的用户信息 bin 1 halt 7
4.4 运算符
+、-、*、/、%
++、--、+=、-=、*=、/=
实例
[root@client ~]# awk 'NR%2==1{print}' awkreg.txt abcd xx abcabcd xx [root@client ~]# awk 'BEGIN{i=0}{i+=NF}END{print i}' awkreg.txt 5
五 . awk流程控制
分支结构
单分支
if(条件){编辑指令}
双分支
if(条件){编辑指令1}else{编辑指令2}
多分支
if(条件){编辑指令1}else if(条件){编辑指令2}.. ..
else{编辑指令N}
5.1 单分支实例
[root@client ~]# awk -F: '{if($3<=1000){i++}}END{print i}' /etc/passwd //统计/etc/passwd中UID小于等于1000的用户个数 39 [root@client ~]# awk -F: '{if($3>1000){i++}}END{print i}' /etc/passwd //统计/etc/passwd文件中UID大于1000的用户个数 4 [root@client ~]# awk -F: '{if($7~/bash$/){i++}}END{print i}' /etc/passwd //统计/etc/passwd文件中登录Shell是“/bin/bash”的用户个数 5
5.2 双分支实例
[root@client ~]# awk -F: '{if($3<=500){i++}else{j++}}END{print i,j}' /etc/passwd //分别统计/etc/passwd文件中UID小于或等于1000、UID大于1000的用户个数 30 13 [root@client ~]# awk -F: '{if($7~/bash$/){i++}else{j++}} END{print i,j}' /etc/passwd //分别统计/etc/passwd文件中登录Shell是“/bin/bash”、 登录Shell不是“/bin/bash”的用户个数 5 38
六 . awk数组
数组的定义及使用
定义数组
格式:数组名[下标]=元素值
调用数组
格式:数组名[下标]
遍历数组
用法:for(变量 in 数组名){print 数组名[变量]}
6.1 实例
[root@svr5 ~]# awk 'BEGIN{a[0]=11;a[1]=88;print a[1],a[0]}' 88 11 [root@svr5 ~]# awk 'BEGIN{a++;print a}' 1 [root@svr5 ~]# awk 'BEGIN{a0++;print a0}' 1 [root@svr5 ~]# awk 'BEGIN{a[0]++;print a[0]}' 1 [root@svr5 ~]# awk 'BEGIN{a[0]=00;a[1]=11;a[2]=22; for(i in a){print i,a[i]}}' 0 0 1 11 2 22