(2)BEGIN和END语句块

awk的所有代码(目前这么认为)都是写在语句块中的。

例如

[[email protected]01 ~]# awk ‘{print $0}‘ a.txt
[[email protected]-01 ~]# awk ‘{print $0}{print $0;print $0}‘ a.txt

每个语句块前面可以有pattern,所以格式为:

pattern1{statement1}pattern2{statement3;statement4;...}

语句块可分为3类:BEGIN语句块、END语句块和main语句块。其中BEGIN语句块和END语句块都是的格式分别为BEGIN{...}END{...},而main语句块是一种统称,它的pattern部分没有固定格式,也可以省略,main代码块是在读取文件的每一行的时候都执行的代码块。

分析下面三个awk命令的执行结果:

awk ‘BEGIN{print "我在前面"}{print $0}‘ a.txt
awk ‘END{print "我在后面"}{print $0}‘ a.txt
awk ‘BEGIN{print "我在前面"}{print $0}END{print "我在后面"}‘ a.txt

根据上面3行命令的执行结果,可总结出如下有关于BEGIN、END和main代码块的特性:

BEGIN代码块:

  • 在读取文件之前执行,且执行一次
  • 在BEGIN代码块中,无法使用$0或其它一些特殊变量

main代码块:

  • 读取文件时循环执行,(默认情况)每读取一行,就执行一次main代码块
  • main代码块可有多个

END代码块:

  • 在读取文件完成之后执行,且执行一次
  • 有END代码块,必有要读取的数据(可以是标准输入)
  • END代码块中可以使用$0等一些特殊变量,只不过这些特殊变量保存的是最后一轮awk循环的数据

原文地址:https://www.cnblogs.com/liujunjun/p/12388921.html

时间: 2024-10-19 15:38:53

(2)BEGIN和END语句块的相关文章

Linux运维三剑客awk必会知识--模式与操作、内自变量、语句块、数组

Linux命令之三剑客awkawk简介awk是三剑客中的老大,awk强大之处在于,它不仅仅是命令,还是一门语言,功能非常强大.报告生成器,格式化后显示,可以自定义函数:awk的处理对象是记录与字段(域).awk处理数据的原理读取到数据后,首先将数据分片,默认是以空格为分隔符,分片后给每个分片引用位置变量参数,然后按照awk命令的条件打印记录与字段在讲awk参数.内置变量.数组之前,首先讲一下什么是记录,什么是字段?字段很好理解,就是默认以空格为分割符分片后的区域,每个区域就是一个字段,就像上面的

zbb20170601 oracle PL/SQL 语句块 游标 自定义游标 异常处理EXCEPTION

--打开日志输出 set serverout on -- PL/SQL 语句块: -- 声明部分 declare v_i number; v_sum number:=0; -- 执行部分 begin v_i := 1; -- 简单loop循环 loop v_sum:=v_sum+v_i; v_i:=v_i+1; if v_i>100 then exit;-- 跳出循环 end if; end loop; dbms_output.put_line(v_sum); -- 异常处理部分 end; --

5:查询两表中的所有字段,满足性别为‘男’的记录(使用语句块)

5:查询两表中的所有字段,满足性别为'男'的记录 1.先创建表t_code_sex 2.创建表t_employee 3.编辑数据 4.执行pl/sql语句块 ---pl/sql语句块查询满足性别为男的 declare type t_employee_record_type is record( v_empid t_employee.emp_id%type, v_emp_name t_employee.emp_name%type, v_sex_name t_code_sex.name%type);

Java中为什么finally语句块一定会被执行?

通过阅读JVM规范,得知编译器是通过冗余来实现finally语句块的.我们可以写段代码做一个验证. JDK版本:8 如下面的代码: import java.io.*; public class Main { public static void main(String[] args) { try { foo(); } catch (IOException e) { int a = 100; } catch (Exception e) { int b = 200; } finally { int

Java静态语句块、语句块、构造方法执行顺序

package com.imooc.practice; class Parent{ public Parent(){ System.out.println("Parent构造方法执行!"); } { System.out.println("Parent非静态语句块执行!"); } static{ System.out.println("Parent静态语句块执行!"); } } public class Child extends Parent{

编译器--支持变量和语句块的计算器(二)

上篇文章记录了一个简单的计算器,但是只能计算一个表达式,比如计算8+3*5,得到值23.这次在其基础上添加了支持语句的功能,并且支持表达式中存在变量.比如下面: num1 := 5; num2 := num1+3*5; num3 := num1 * (num2 - 20/5); 最后计算并返回的值是num3的值80. 根据这个例子,可以看出相比于上次那个简单的计算器,添加的特性包括1.支持赋值语句  2.支持变量  3.支持多条赋值语句,也就是语句块.其中语句之间使用分号分隔,赋值符号为":=&

浅谈 js 语句块与标签

原文:浅谈 js 语句块与标签 语句块是什么?其实就是用 {} 包裹的一些js代码而已,当然语句块不能独立作用域.可以详细参见这里<MDN block> 也许很多人第一印象 {} 不是对象字面量么?怎么成了语句块了?如果在赋值语句或者表达式里用的时候,确实是对象字面量,如: var a = {}; ({toString:function(){return "hehe"}}) + "..."; 是不是很有意思..但是直接使用如: {toString: fu

关于 Java 中 finally 语句块的深度辨析

可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机.接下来我就带您一步一步的揭开这个 finally 的神秘面纱. 问题分析 首先来问大家一个问题:finally 语句块一定会执行吗? 很多人都认为 finally 语句块是肯定要执行的,其中也包括一些很有经验的 Java 程序员.可惜并不像大多人所认为的那样,对于这个问题,答案当然是否定的,我们先来看下面这个例子. 清单 1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1

C++学习之路: try&amp;catch 语句块处理异常

#include <iostream> #include <string> #include <vector> #include <stdexcept> using namespace std; //对于不同的异常可以采取不同的catch块进行捕捉 int main(int argc, const char *argv[]) { try { int i; cin >> i; if(i == 0) throw runtime_error("