Shell学习awk_07

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值