【shell】shell脚本实战-awk工作模式讲解(2)

awk中的各种模式详解
1. awk 脚本拥有的形式

awk ‘/pattern/ { actions }’ filename

你通常会发现脚本中的模式(/pattern/)是一个正则表达式,此外,你也可以在这里用特殊模式 BEGIN 和 END。因此,我们也能按照下面的形式编写一条 awk 命令:

awk ‘BEGIN { actions } /pattern/ { actions } /pattern/ { actions }…END { actions }’ filenames

语法结构如下图:

在这里插入图片描述

其中:BEGIN END是AWK的关键字部,因此必须大写;这两个部分开始块和结束块是可选的

特殊模块:

BEGIN语句设置计数和打印头部信息,在任何动作之前进行

END 语句输出统计结果,在完成动作之后执行

awk通过Pattern(模式)来控制是否处理当前记录,如果当前记录和Pattern匹配,则执行Action(操作)。在awk中,有下列几种模式:

1、正则表达式

2、关系表达式

3、组合的Pattern

4、Pattern1,Pattern2

5、BEGIN

6、END

为了说明以上各种模式,我们这里准备一个文件score.txt,以实例的方式一一进行说明,score.txt文件内容如下:

[root@ecs-c13b awk]# cat score.txt

guojing 85 92 78

zhaoyun 89 90 75

sanfeng 84 88 80

guanyu 83 78 90

liubei 86 88 79

2. 正则表达式
  • 查询有一门课程成绩在90-99区间的学习的成绩。

[root@ecs-c13b awk]# awk ‘/9[0-9]/ {print $0}’ score.txt

guojing 85 92 78

zhaoyun 89 90 75

guanyu 83 78 90

以上指令查询有一门课成绩在[90-99]区间的学生的成绩信息,/9[0-9]/部分即为awk程序指令中的Pattern,这里Pattern的类型为正则表达式。

awk ‘$3 ~ /9[0-9]/ {print $0}’ score.txt

zhaosan 85 92 78

lisheng 89 90 75

这条指令在上一条指令的基础上增加了限制,需要第二门课(数学)成绩在[90-99]区间才可与模式匹配。这里的 ~ 操作符用来表示变量是否与正则表达式匹配,如果要判断不匹配,可以使用 !~ 操作符。

3. 关系表达式

awk ‘$3 >= 90 {print $0}’ score.txt

zhaosan 85 92 78

lisheng 89 90 75

可用来形成模式关系运算符包括: <(小于)、>(大于)、<=(小于或等于)、>=(大于或等于)、= =(等于)和 ! =(不等于)。

这条指令的作用也是查询数学成绩在90分以上的学生成绩信息,不过比正则表达式中的范围要大一点,这里100分也是符合模式的。

4. 组合的Pattern(模式)

awk ‘$3 >= 90 && $3 < 100 {print $0}’ score.txt

zhaosan 85 92 78

lisheng 89 90 75

布尔运算符 ||(或)&&(和)以及 !(不)将模式组合,组合后如果求值为真则模式匹配,否则不匹配。这里就解决了关系表达式示例中包含了100的问题。

5. Pattern1,Pattern2

awk ‘FNR == 2 , FNR == 4 {print $0}’ score.txt

lisheng 89 90 75

zhaoyun 84 88 80

guanyu 83 78 90

其实这个也可以归为组合的模式中,只是这种模式比较特殊,故单独列出。以,(逗号)隔开的两个Pattern指定一个范围,对从匹配第一个Pattern的记录开始,到匹配第二个Pattern结束的所有记录执行Action

6. BEGIN

BEGIN模块在awk读取文件之前就执行,一般用来定义我们的内置变量(预定义变量,eg:FS,RS)可以输出表头(excel表格名称)

BEGIN模式之前在实例中提到,自定义变量,给内容变量赋值等,都是使用过。需要注意的是BEGIN模式后面要结合一个action操作块,包含在大括号内

awk必须在对输入文件进行任何处理前先执行BEGIN定义的action操作块。我们可以不要任何输入文件,就可以对BEGIN模块进行测试,因为awk需要先执行完BEGIN模式,才对输入文件做处理。BEGIN模式常常被用来修改内置变量ORS,RS,FS,OFS,等的值。

a) 给文件开头添加信息

假如我们要将学生成绩表打印出来,那总得加点表头什么的吧,就可以放到BEGIN中了。

awk ‘BEGIN { print “Print student score table”} {print $0}’ score.txt

Print student score table

zhaosan 85 92 78

lisheng 89 90 75

zhaoyun 84 88 80

guanyu 83 78 90

liubei 86 88 79

b) 取eth0的ip地址

ifconfig eth0|awk -F ‘(addr:)|(Bcast:)’ ‘NR==2{print $2}’

ifconfig eth0|awk -F ‘[: ]+’ ‘NR==2{print $4}’

ifconfig eth0|awk -F ‘[^0-9.]+’ ‘NR==2{print $2}’

也可以写成

ifconfig eth0|awk ‘BEGIN{FS=“(addr:)|(Bcast:)”} NR==2{print $2}’

ifconfig eth0|awk ‘BEGIN{FS=“[^0-9.]+”} NR==2{print $2}’

ifconfig eth0|awk ‘BEGIN{FS=“[: ]+”} NR==2{print $4}’
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

onvert/6c361282296f86381401c05e862fe4e9.png)

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值