入门

Awk是一种便于使用且表达能力强的程序设计语言,可应用于各种计算和数据处理任务。

''单引号内的部分是个完整的awk程序,包含单个模式-动作语句。完整的awk程序后紧跟的是数据的输入文件

模式在前,动作语句在大括号内。

AWK程序结构

引号之间的部分是awk编程语言写的程序,每个awk程序都是一个或多个模式-动作语句的序列:

pattern { action }
pattern { action }
...

awk的基本操作是一行一行地扫描输入,搜索匹配(匹配的具体含义根据具体的模式而定)任意程序中模式的行。

  1. 每个模式一次测试每个输入行

  2. 对于匹配到行的模式,其对应的动作都得到执行

然后读取下一行并继续匹配,直到所有的输入读取完毕。

例如:

$3 == 0 { print $1 }  单个模式-动作语句,对于第三个字段为0的每行,打印其第一个字段。

模式-动作语句中的模式或动作(但不是同时两者)都可以省略。

  1. 只有模式没有动作时,被模式匹配到的每一行都会被直接打印出来

  2. 没有模式只有动作时,对输入的每一行都进行对应的动作

由于模式和动作两者任一都是可选的,所以需要使用大括号包围动作以区分于其他模式。

执行AWK程序

执行awk程序的方式有多种。

注意命令行中的程序是用单引号包围着的。这会防止shell解释程序中 $ 这样的字符,也允许程序的长度超过一行。

  1. 在命令行执行,并指定输入文件:

awk 'program' input files   #而在每个指定的输入文件上执行这个program。
awk '$3 == 0 { print $1 }' file1 file2    #打印file1和file2文件中第三个字段为0的每一行的第一个字段。
  1. 在命令行执行,省略输入文件:

awk 'program'

这种情况下,awk会将program应用于你在终端中接着输入的任意数据行,直到你输入一个文件结束信号(Unix系统上为control-d)

  1. 如果程序较长,将程序写到一个单独的文件中,在命令行执行对应的文件:

awk -f progfile     optional list of input files

其中 -f 选项指示awk从指定文件中获取程序。

报错

如果awk程序存在错误,awk会给一段诊断信息。

例如:

awk '$3 == 0 [ print $1 }' emp.data

awk: syntax error at source line 1
context is
$3 == 0 >>> [ <<<
extra }
missing ]
awk: bailing out at source line 1

“Syntax error”意味着在 >>> <<< 标记的地方检测到语法错误。 “Bailing out”意味着没有试图恢复。

有时会得到更多的帮助-关于错误是什么,比如大括号或括弧不匹配。

因为存在句法错误,awk就不会尝试执行这个程序。然而,有些错误,直到你的程序被执行才会检测出来。例如,如果你试图用零去除某个数,awk会在这个除法的地方停止处理并报告输入行的行号以及在程序中的行号

最后更新于

这有帮助吗?