1、AWK的条件表达

如下图所示:

2、条件表达式说明

以下练习使用如下文本:

ID      Name    Python  Linux   MySQL   Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96,66
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33

(1)BEGIN

BEGIN是AWK的保留字,是一种特殊的条件类型。

BEGIN的执行时机是在AWK程序一开始时,尚未读取任何数据之前执行。

BEGIN后的动作只执行一次,因为当AWK开始从文件中读入数据,BEGIN的条件就不再成立,所以BEGIN定义的动作只能被执行一次。

练习:执行命令查看BEGIN作用:

执行命令:awk 'BEGIN{print "This is BEGIN action"} {printf $2 "\t" $3 "\t" $6 "\t" "\n"}' student.txt

[root@localhost tmp]# awk 'BEGIN{print "This is BEGIN action"} {printf $2 "\t" $3 "\t" $6 "\t" "\n"}' student.txt
This is BEGIN action
Name Python Java
Tangs 88 85.55
Sunwk 99 96.66
Zhubj 77 74.44
Shahs 66 63.33

说明:

  • AWK命令只要检测不到完整的单引号不会执行,所以这个命令的换行不用加入\,就是一行命令
  • 上边命令定义了两个动作:

    第一个动作使用BEGIN条件,所以会在读入文件数据前打印“This is BEGIN action”(只会执行一次)

    第二个动作会打印文件中的对应文本。

(2)END

END也是AWK保留字,不过刚好和BEGIN相反。

END是在AWK程序处理完所有数据,即将结束时执行。END后的动作只在程序结束时执行一次。

练习:执行命令查看END作用

执行命令:awk 'END{print "This is END action"} {printf $2 "\t" $3 "\t" $6 "\t" "\n"}' student.txt

[root@localhost tmp]# awk 'END{print "This is END action"} {printf $2 "\t" $3 "\t" $6 "\t" "\n"}' student.txt
Name Python Java
Tangs 88 85.55
Sunwk 99 96.66
Zhubj 77 74.44
Shahs 66 63.33
This is END action

说明:在输出结尾输入“This is END action”,这并不是文档本身的内容,而且只会执行一次。

(3)关系运算符

假设我想看看Java绩大于等于80分的学员是谁,就可以这样输入命令:

grep -v "Name" student.txt | awk '$6>=80 {printf $2 "\n"}'

# 判断第六字段(Java成绩)大于等于80分的行,如果判断式成立,则打印第2列(学员名)
[root@localhost tmp]# grep -v "Name" student.txt | awk '$6>=80 {printf $2 "\n"}'
Tangs
Sunwk

grep -v "Name" student.txt是把标题过滤掉。

(4)说明AWK中条件表达式的执行过程

要先说明一下,虽然AWK是列提取命令,但是也要按行来读入的。

在AWK处理一个文本文件的时候:

  • 先判断表达式中有没有BEGIN

    如果有,就先执行BEGIN定义的操作,且执行一次。
  • 如果没有BEGIN或者BEGIN定义的动作执行完成之后,会把文本中的第一行数据读入AWK中,

    把该行的整行数据赋予$0变量中,

    把该行数据的第一列赋值在$1变量中,第二列赋值在$2变量中,以此类推。
  • 例如awk '{printf $2 "\n"}' student.txt,意思是打印文本中的第二列姓名。

    我们先忽略掉条件,流程是:

    AWK读取第一行数据(上面一步),然后执行动作输出第二列信息,也就是输出第一行的第二列信息。

    然后开始读取第二行数据,然后再执行动作,输出第二行的第二列信息,

    然后再读取第三行数据,之后执行动作,输出第三行的第二列信息,

    以此类推,基本上就是这样的一个过程。
  • 然后在加上条件awk '$6>=80 {printf $2 "\n"}' student.txt

    判断第六列Java的成绩大于80分,才输出。

    还是和上边一样,先是AWK读取第一行数据完成之后,就要处理动作了,

    但是在处理动作之前,先要判断一下动作前面的条件是否成立,

    如果成立,则执行后边的动作。

    如果不成立,则不执行跟在后边的动作。

    然后在开始读取第二行数据,重复上边的流程,以此类推。

    总结一下就是:加入了条件之后,只有条件成立动作才会执行,如果条件不满足,则动作则不运行。
  • 最后如果有END,则把END中定义的动作执行一次。

以上就是AWK的执行流程。

(5)AWK中使用正则表达式

如果要想让AWK识别字符串,必须使用//包含,//中识别的就是正则表达式规则匹配的字符串。

例如:

# 输出打印Sunwk的成绩
# awk会匹配有Sunwk符号的行,并输出
[root@localhost tmp]# awk '/Sunwk/ {print}' student.txt
2 Sunwk 99 98 97 96.66

注意:这里要注意在AWK中,使用//包含的字符串,AWK命令才会查找。也就是说字符串必须用//包含,AWK命令才能正确识别。

(6)A~B练习

A~B是A包含B的意思。

练习:查看Sunwk用户的Java成绩。

# 匹配第二字段中包含有“Sun”字符,则打印第六字段数据
[root@localhost tmp]# awk '$2 ~ /Sun/ {printf $6 "\n" }' student.txt
96.66

提示:(6)练习的方式,是在某一列中查找是否包含一个字符串。而上面(5)的写法,是在一行数据当中匹配是否包含一个字符串,根据需求灵活使用。

注意:~两边有无空格都可以。

拓展练习:

当使用df命令查看分区使用情况时,如果我只想查看真正的系统分区的使用状况,而不想查看光盘和临时分区的使用状况,则可以执行如下:

# 查询包含有sda+数字的行,并打印第一字段和第五字段
[root@localhost tmp]# df -h | awk '/sda[0-9]/ {printf $1 "\t" $5 "\t" "\n"}'
/dev/sda3 12%
/dev/sda1 15%

『忘了再学』Shell基础 — 28、AWK中条件表达式说明的更多相关文章

  1. 『忘了再学』Shell基础 — 29、AWK内置变量

    目录 1.AWK内置变量 2.练习说明 (1)$n变量练习 (2)FS变量练习 (3)NF变量和NR变量练习 3.总结: 1.AWK内置变量 AWK内置变量如下表: awk内置变量 作用 $0 代表目 ...

  2. 『忘了再学』Shell基础 — 27、AWK编程的介绍和基本使用

    目录 1.AWK介绍 (1)AWK概述 (2)printf格式化输出 (3)printf命令说明 2.AWK的基本使用 (1)AWK命令说明 (2)AWK命令使用 1.AWK介绍 (1)AWK概述 A ...

  3. 『忘了再学』Shell基础 — 32、Shell中test测试命令详解

    目录 1.test测试命令 (1)test命令介绍 (2)test命令使用方式 (3)示例 2.按照文件类型进行判断 3.按照文件权限进行判断 4.两个文件之间进行比较 5.两个整数之间比较 6.字符 ...

  4. 『忘了再学』Shell基础 — 3、echo命令的介绍与使用

    目录 1.echo命令的作用 2.echo命令的基本用法 3.echo命令的-e选项用法 4.echo命令一些特殊用法 (1)输出字符带有字体颜色 (2)输出字符带有背景颜色 在讲Shell脚本之前, ...

  5. 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

    提示:本篇文章接上一篇文章,主要说说()小括号和{}大括号的区别与使用. 8.()小括号 ():用于一串命令执行时,()中的命令会在子Shell中运行.(和下面大括号一起说明) 9.{}大括号 {}: ...

  6. 『忘了再学』Shell基础 — 24、Shell正则表达式的使用

    目录 1.正则表达式说明 2.基础正则表达式 3.练习 (1)准备工作 (2)*练习 (3).练习 (4)^和$练习 (5)[]练习 (6)[^]练习 (7)\{n\}练习 (8)\{n,\}练习 ( ...

  7. 『忘了再学』Shell基础 — 25、扩展正则表达式

    目录 1.扩展正则表达式说明 2.练习 (1)+和?练习 (2)|和()练习 3.注意(重点) 1.扩展正则表达式说明 熟悉正则表达式的童鞋应该很疑惑,在其他的语言中是没有扩展正则表达式说法的,在Sh ...

  8. 『忘了再学』Shell基础 — 30、sed命令的使用

    目录 1.sed命令说明 2.行数据操作 (1)查看文件中的数据 (2)删除文件中的数据 (3)向文件中追加数据 (4)向文件中插入数据 (5)修改文件中的多行数据(删除,追加,插入) (6)替换文件 ...

  9. 『忘了再学』Shell基础 — 1、Shell的介绍

    目录 1.Shell的由来 2.Shell的两种执行指令方式 3.什么是Shell脚本 4.Shell 是一种脚本语言 1.Shell的由来 我们比较熟悉Windows系统的图形化界面,对于图形界面来 ...

随机推荐

  1. kali添加开机自启[亲测有效]

    kali添加开机自启 采用systemd的方法,kali默认是没有rc.local的,需要自己创建.本方法也适用于ubuntu 18.04 64bit 改写rc-local.service 文件 先从 ...

  2. Java 从零开始实现一个画图板、以及图像处理功能,代码可复现

    Java 从零开始实现一个画图板.以及图像处理功能,代码可复现 这是一个学习分享博客,带你从零开始实现一个画图板.图像处理的小项目,为了降低阅读难度,本博客将画图板的一步步迭代优化过程展示给读者,篇幅 ...

  3. 共读《redis设计与实现》-数据结构篇

    准备将之前攒下的书先看一遍,主要是有个大概的了解,以后用的时候也知道在哪里找.所以准备开几篇共读的帖子,激励自己多看一些书. Redis 基于 简单动态字符串(SDS).双端链表.字典.压缩列表.整数 ...

  4. JS_进阶-遍历对象属性、数组输出、Math、正则表达式匹配

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  5. HMS Core 6.4.0版本发布公告

    支持转化事件回传至华为应用市场商业推广,便捷归因,实时调优: 卸载分析新增卸载前路径分析,深度剖析卸载根因. 查看详情 新增关键帧能力,通过关键帧点可实现图片.文字等位置移动.旋转等动态效果,比如文字 ...

  6. 【mq】从零开始实现 mq-01-生产者、消费者启动

    MQ 是什么? MQ(Message Queue)消息队列,是基础数据结构中"先进先出"的一种数据结构. 指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递--生产者产生 ...

  7. javaScript中Math内置对象基本方法入门

    概念 Math 是javaScript的内置对象,包含了部分数学常数属性和数学函数方法. Math 不是一个函数对象,用户Number类型进行使用,不支持BigInt. Math 的所有属性与方法都是 ...

  8. Android8.0 后台服务保活的一种思路

    原文地址:Android8.0 后台服务保活的一种思路 | Stars-One的杂货小窝 项目中有个MQ服务,需要一直连着,接收到消息会发送语音,且手机要在锁屏也要实现此功能 目前是使用广播机制实现, ...

  9. SpringBoot从0到0.7——第一天

    SpringBoot从0到0.7--第一天 学习的第一步当然是收拾好心情,先把环境搭建起来,写出第一个helloword出来. 第一步:安装IDEA和Tomcat 我安装的是IDEA 2021.2.2 ...

  10. python之贪婪算法

    贪婪算法 贪婪算法也称为最优算法,这种算法并不是最准确的答案,但确认最接近答案的近似算法. 这时候有人会问,不是最准确的答案我要她干嘛?但是在日常中,我们有时候会遇到一些我们无法处理的问题,甚至是要花 ...