Shell
awk
awk编程语言数据处理引擎
创造者:Aho Weinberger Kernighan
基于模式匹配检查输入文本,逐行处理并输出
通常用在shell脚本中,获取指定行的数据
单独使用的时,可以对文本数据做统计
用法
awk 选项 (条件)指令 被处理的文档
前置指令| awk 选项 (条件)指令
#素材准备
[root@tedu ~]# vim test
hello the world
welcome to beijing
[root@tedu ~]# grep hello test #模糊搜索hello
[root@tedu ~]# awk '{print}' test #输出文本内的内容
hello the world
welcome to beijing
awk内置变量 $1 $2 .... $0代表所有 NR行号 NF列号
[root@tedu ~]# awk '{print $1}' test #查看第一列
hello
welcome
#正则匹配搜索有hello的行,输出第二列
[root@tedu ~]# awk '/hello/{print $2}' test
the
[root@tedu ~]# awk '{print $0}' test #显示所有的行
[root@tedu ~]# awk '{print NF}' test #显示列号
[root@tedu ~]# awk '{print NR}' test #显示行号
#显示行号何列号
[root@tedu ~]# awk '{print NR,NF}' test
1 3
2 3
#awk默认以空格为分隔符
[root@tedu ~]# head -5 /etc/passwd > user
[root@tedu ~]# cat user
分隔符默认为空格
#-F选项,修改分隔符为 : 以冒号进行 分割
[root@tedu ~]# awk -F: '{print $3}' user #查看第三列的用户id
[root@tedu ~]# awk -F: '{print $7}' user #获取用户解释器
[root@tedu ~]# awk '{print "这是常量"}' user #输出常量
#变量加常量输出
[root@tedu ~]# awk -F: '{print $1"的解释器是:"$7}' user
格式化文件输出
akw会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行之后做一些总结性的工作,在命令格式上分别体现如下
awk [选项] ‘[条件]{指令}’ 文件
awk [选项] ‘BEGIN{指令} {指令} END{指令}’ 文件
BEGIN{}行前处理,读取文件内容前指定,指令执行1次
{}逐行处理,读取文件过程中执行,指令执行n行
END{}行后处理,读取文件结束后执行指令执行1次
#只执行一次,在处理文本之前执行
[root@tedu ~]# awk 'BEGIN{print "ABCD"}' user
ABCD
[root@tedu ~]# awk 'BEGIN{print "ABCD"}'
ABCD
#
[root@tedu ~]# awk 'BEGIN{print "abc"}{print}END{print NR}' user
awk高级应用
awk流程控制
分支结构
单分支
if(条件){编辑指令}
双分支
if(条件){编辑指令1}else{指令2}
多分支 if(条件){编辑指令}else if(条件){编辑指令2}…else{编程指令N}
统计user中以bash结尾的行
awk '{if(/bash$/){x++}}END{print x}' user #如果找到以bash结尾的就+1
统计/etc/passwd文件中中UID小于等于1000的用户个数
awk -F: '{if($3<=1000){i++}}END{print i}' /etc/passwd
- 单分支结构
统计/etc/passwd文件中UID大于1000的用户个数
awk -F: '{if($3>1000){i++}}END{print i}' /etc/passwd
统计/etc/passwd文件中登录Shell是“/bin/bash”的用户个数
awk -F: '{if($7~/bash$/){i++}}END{print i}' /etc/passwd
- 双分支
分别统计/etc/passwd文件中UID小于或等于1000,UID大于1000的用户个数
awk -F: '{if($3<=1000){i++}else{j++}}END{print i,j}' /etc/passwd
分别统计/etc/passwd文件中登录Shell是“/bin/bash”、 登录Shell不是“/bin/bash”的用户个数:
awk -F: '{if($7~/bash$/){i++}else{j++}} END{print i,j}' /etc/passwd
awk数组
数组的语法格式
数组是一个可以存储多个值的变量,具体使用的格式如下:
定义数组的格式:数组名[下标]=元素值
调用数组的格式:数组名[下标]
遍历数组的用法:for(变量 in 数组名){print 数组名[变量]}。
[root@tedu ~]# awk 'BEGIN{a[0]=11;a[1]=88;print a[1],a[0]}'
88 11
[root@tedu ~]# awk 'BEGIN{a++;print a}'
1
[root@tedu ~]# awk 'BEGIN{a0++;print a0}'
1
[root@tedu ~]# awk 'BEGIN{a[0]++;print a[0]}'
1
[root@tedu ~]# awk 'BEGIN{a[0]=0;a[1]=11;a[2]=22; for(i in a){print i,a[i]}}'
0 0
1 11
2 22
注意,awk数组的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号:
[root@tedu ~]# awk 'BEGIN{a["hehe"]=11;print a["hehe"]}'
11