美文网首页运维监控
Linux三剑客(awk-5)-awk的动作(action)

Linux三剑客(awk-5)-awk的动作(action)

作者: 小胖学编程 | 来源:发表于2019-05-16 10:03 被阅读0次

    在前文中,我们已经使用用过了awk的选项、模式以及动作

    awk动作

    如上图所示,红线标注部分就是awk命令中的“动作”。

    awk动作

    上图中,我们将动作拆分成两个部分。

    • 红线标注为第一部分:最外侧的括号,即"{ }"。
    • 蓝线标注为第二部分:"print $0"。

    其实,这两个部分都可以被称为“动作”,只不过它们是不同“类型”的动作而已。

    • print属于输出语句类型的动作;
    • “{ }”其实也是一个动作,只不过,“{}”属于“组合语句”类型的动作。“组合语句”类型的动作的作用是将多个代码组合成代码块。
    {}的动作

    如上图所示,我们使用了两个大括号"{}",它们属于"组合语句"类型的动作,它们分别将两个print括住,表示这两个print动作分别是两个独立的个体。

    组合动作

    也就是说,我们可以理解,上图中一共有4个“动作”,两队大括号,两个print,但是上图中,每个大括号中只有一个动作,而我们说过,“组合语句”的作用是将多个代码或多个动作组合成代码块,组合后的代码块被当做一个整体。那么,我们能不能把上图中的两个print动作组合成一个整体?

    将两个print组合成一个整体

    当我们把多个动作(多段代码)组合成一个代码块的时候,每段动作(每段代码)之间需要用;隔开。

    使用;分割动作

    1. 控制语句条件判断

    条件判断语句
    • "if(NR==1)"中的NR为awk的内置变量,NR为行号之意,所以"if(NR==1)"表示行号为1时,条件成立。
    • "if(NR==1){print $0}"表示行号为1满足条件,条件满足时,打印整行。
    最外侧需要有一层大括号

    为什么最外侧有大括号。如果非要一个理由,那就是所有动作的最外侧必须用{}括起

    if语句中的大括号,也可以执行多个动作,把多个代码当做一个整体,也就是说,如果if所对应的条件成立,则执行if的大括号中的所有命令。

    条件成立后,执行括号里面的所有命令

    上例中,if对应的大括号中有多条语句,所以if语句中的大括号不能忽略。但是如果if对应的大括号只有一条命令,那么if对应的大括号则可以省略。

    还记得我们在前面中使用到的“模式”吗?

    模式和动作

    上图中的用法为awk的【模式】用法,而这篇介绍的【动作】虽然两者在语法上有所区别,但是达到的目的是相同的。

    if else的条件控制语句

    if-else模式

    上例中,我们使用了“关系表达式”模式,同时,在动作中,使用了“if...else if...else”这样的“控制语句”。

    2. 循环语句

    for循环

    上例中,我们使用了BEGIN模式,BEGIN模式对应的动作中,包含了for循环语句。看到这里,是不是觉得与其他语言中的for循环没有区别。只不过,上例中的for循环语句都写在了一行中而已。

    while循环

    当while对应的条件满足时,则执行对应的语句的语句,语句执行完成后,对条件修改。

    do...while语句

    同理,do...while的示例如下,他与while循环的不同之处在于,while循环只有当满足条件时才会执行对应语句,而do...while循环则是无论是否满足条件,都会执行一遍do对应的代码,然后再判断是否满足while中对应的条件,满足条件,则执行do对应的代码,如果不满足条件,则不再执行do对应的代码。

    3. 循环跳出条件

    1. 使用continue跳出当前循环
    continue跳出当前循环
    1. 使用break跳出整个循环体
    break跳出整个循环体
    1. 使用exit退出整个awk命令

    在shell中,exit命令表示退出当前脚本,在awk中,它的含义也是类似的,表示不再执行awk命令,相当于退出当前的awk命令。

    exit退出awk命令

    当在awk中使用了END模式。exit的作用并不是退出整个awk命令,而是直接执行END模式中的动作。

    exit退到END命令中
    1. 使用next命令结束当前行
      在awk中,除了能够使用exit命令结束整个awk,还能够使用next命令结束当前行。

    我们知道,awk是逐行对文本进行处理的。也就是说,awk会处理完当前行,在继续处理下一行。

    使用next命令即可让awk直接从下一行开始处理,换句话说,next命令可以使得awk不继续执行当前操作,而转到下一行。

    next命令直接执行下一行

    其实,next命令与continue有些类似,只是,continue是针对“循环”而言的,continue的作用就是结束“本次循环”,而next是针对“逐行处理而言的”,next的作用就是结束“对当前行的处理”,从而直接执行“下一行”。本质上awk的逐行处理也可以理解为一种循环,因为awk一直在"循环"处理着"每一行"。

    相关文章

      网友评论

        本文标题:Linux三剑客(awk-5)-awk的动作(action)

        本文链接:https://www.haomeiwen.com/subject/eajpaqtx.html