16boke - 一路博客

linux命令之awk详细教程续

一、Patterns

awk 通过判断 Pattern 的值来决定是否执行其后所对应的Actions。这里列出几种常见的Pattern

1、BEGIN

BEGIN 为 awk 的保留字,是一种特殊的 Pattern。

BEGIN 成立(其值为true)的时机是:"awk 程序一开始执行,尚未读取任何数据之前。"

所以在 BEGIN { Actions } 语法中,其 Actions 部份仅于程序一开始执行时被执行一次。当 awk 从数据文件读入数据行后, BEGIN 便不再成立,故不论有多少数据行,该 Actions 部份仅被执行一次。

一般常把 "与数据文件内容无关" 与 "只需执行一次" 的部分置于该Actions(以 BEGIN 为 Pattern)中。

BEGIN {
      FS = "[ \t:]" # 于程序一开始时, 改变awk切割字段的方式
      RS = ""      # 于程序一开始时, 改变awk分隔数据行的方式
      count = 100   # 设定变量 count 的起始值
      print " This is a title line " # 印出一行 title
    }
    .......
    # 其它 Pattern { Actions }
    .....

有些awk程序甚至"不需要读入任何数据行"。遇到这情况可把整个程序置于以 BEGIN 为 Pattern的 Actions 中。

例如:BEGIN { print " Hello ! the Word ! " }

2、END

END 为 awk 的保留字,是另一种特殊的 Pattern。

END 成立(其值为true)的时机与 BEGIN 恰好相反,为:

"awk 处理完所有数据,即将离开程序时"

平常读入数据行时,END并不成立,故其对应的 Actions 并不被执行;唯有当awk读完所有数据时,该 Actions 才会被执行。

注意:不管数据有多少行,该 Actions 仅被执行一次。

3、关系表达式

使用像 " A 关系运算符 B" 的表达式当成 Pattern。

当 A 与 B 存在所指定的关系(Relation)时,该 Pattern 就算成立(true)。

例如:length($0) <= 80 { print $0 }

上式中 length($0) <= 80 是一个 Pattern,当 $0(数据行)的长度小于等于80时该 Pattern 的值为true,将执行其后的 Action (打印该行数据)。

awk 中提供下列 关系运算符(Relation Operator)

运算符含意
>大于
<小于
>=大于或等于
<=小于或等于
==等于
!=不等于
~match
!~not match

上列关系运算符除~(match)与!~(not match)外,与 C 语言中的含意一致。

~(match) 与!~(match) 在 awk 的含意简述如下:

若 A 为一字符串,B 为一正则表达式:

A ~  B 判断 字符串A 中是否 包含    能匹配(match)B式样的子字符串。

A !~ B 判断 字符串A 中是否 未包含 能匹配(match)B式样的子字符串。

例如:$0 ~ /program[0-9]+\.c/ 整个是一个 Pattern,用来判断$0(数据行)中是否含有可 match  /program[0-9]+\.c/ 的子字符串,若$0 中含有该类字符串,则执行 print (打印该行数据)。

Pattern 中被用来比对的字符串为$0 时(如本例),可仅以正则表达式部分表示整个Pattern。故本例的 Pattern 部分$0 ~/program[0-9]+\.c/ 可仅用/program[0-9]+\.c/表之

4、正则表达式

直接使用正则表达式当成 Pattern,此为 $0 ~ 正则表达式 的简写。

该 Pattern 用以判断 $0(数据行) 中是否含有匹配该正则表达式的子字符串,若含有,该式成立(true),则执行其对应的 Actions。

例如:

/^[0-9]*$/ { print "This line is an integer !" }

$0 ~ /^[0-9]*$/ { print "This line is an integer !" }

Shell  awk