1. AWK编程模型
awk程序是由一个主输入循环(main input loop)维持,主输入循环反复执行,直到终止条件被触发。awk已经搭建好了主输入循环框架,我们写的代码被嵌到主输入循环框架中执行。主输入循环依次自动读取输入文件行,以供处理,而处理的文件执行的动作是由我们自己添加的。
awk 还定义了两个特使的字段:BEGIN和END,BEGIN主要用于在主输入循环之前执行,即在未读取输入文件行之前执行,END则相反,用于在主输入循环之后执行,即在读取输入文件完毕之后执行。
2. awk调用方法
有如下的三种调用awk的方法:
(1). 在shell命令行中输入命令执行: awk [-F 域分隔符] `awk程序段` 输入文件
(2). awk插入到脚本中,然后调用脚本进行执行
awk -f awk脚本文件 输入文件
(3). 将awk插入到脚本文件中,直接执行
./awk脚本文件 输入文件
3. 常用的awk编程
1. awk模式匹配
任何awk语句都是由模式(pattern)和动作(action)组成。模式是一组用于测试输入行是否需要执行动作的规则,动作是包含语句、函数和表达式的执行过程。
注意其中的命令部分是单引号; 以/分隔符号;^$ 是正则表达式,表示空白行。print表示该动作是打印操作。
以上的命令表示 读取输入文件input.txt 若里面的一行是空白行,则打印 This is a blank line.
2. awk中的记录和域
awk 认为输入文件是结构化的,awk将每个输入文件行定义为记录,行中的每个字符串定义为域,域之间用空格、Tab键或其它分隔符号进行分隔,分隔域的符号叫分隔符。例如:
Zhang San 021-8888666
awk定义域操作符$ 来指定执行动作的域,域操作符$后面跟数字或变量来标识域的位置,每条记录的域从1开始编号,例如: $1 表示第1个域、$2表示第2个域,$0表示所有的域。例如:
studentrecord.txt 中存放 三个学生的姓名以及电话号码,姓和名字之间只有一个空格;名和电话之间是一个Tab键。 只打印第一个域。若打印全部可以$0
kenvindeMacBook-Air:$ awk '{print $0}' studentrecord.txt
Zhang San 66661111
Li Si 8888222
Wang Wu 9999655
域操作符$之后也可以跟变量,或者变量的表达式。例如:
其中BEGIN字段中的语句是在遍历输入文件之前执行的。 打印第3个域的值。
也可以使用-F选项改变分隔符例如: -f 参数则表示调用的awk脚本。
上面默认分隔符是空格时电话的域是第3个,若使用-F的分隔符则电话的域则变成了第2个域。
也可以通过更改awk的环境变量FS来改变分隔符,例如:
也可以使用正则表达式将分隔符设置为多个字符,例如:FS="\t" 一个空格 ; FS="\t+" 则表示一个或者多个Tab键作为分隔符。
以上是简单总计几个常用的用法,后续的用法明天再续。