原文: http://doc.lazyhack.net/awk.htm
Actions 是由下列指令(statement)所组成 :
awk 中大部分指令与 C 语言中的用法一致, 此处仅介绍较为常用或容易混淆的指令的用法.
close 指令
该指令用以关闭一个打开的文件, 或 pipe (见下例)
范 例 :
BEGIN { print "ID # Salary" > "data.rpt" }
{ print $1 , $2 * $3 | "sort -k 1 > data.rpt" }
END{ close( "data.rpt" )
close( "sort -k 1 > data.rpt" )
print " There are", NR, "records processed."
}
说 明 :
(a)上例中, 一开始执行 print "ID # Salary" > "data.rpt" 指令来输出一行抬头. 它使用 I/O Redirection ( > )将数据转输出到data.rpt,故此时文件 data.rpt 是处於 Open 状态.
(b)指令 print $1, $2 * $3 不停的将输出的资料送往 pipe(|), awk在程序将结束时才会呼叫 shell 使用指令 "sort -k 1 > data.rpt" 来处理 pipe 中的数据; 并未立即执行, 这点与 Unix 中pipe的用法不尽相同.
(c)最后希望於文件 data.rpt 的末尾处加上一行 "There are.....".但此时, Shell尚未执行 "sort -k 1 > data.rpt" 故各数据行排序后的 ID 及 Salary 等数据尚未写入data.rpt. 所以得命令 awk 提前先通知 Shell 执行命令 "sort -k 1 > data.rpt" 来处理 pipe 中的资料. awk中这个动作称为 close pipe. 是由执行 close ( "shell command" )来完成. 需留心 close( )指令中的 shell command
需与"|"后方的 shell command 完全相同(一字不差), 较佳的方法是先以该字串定义一个简短的变量, 程序中再以此变量代替该shell command
(d)为什么执行 close("data.rpt") ? 因为 sort 完后的资料也将写到data.rpt,而该文件正为awk所打开使用(write)中, 故awk程式中应先关闭data.rpt. 以免造成因二个 processes 同时打开一个文件进行输出(write)所产生的错误.
system 指令
该指令用以执行 Shell上的 command.
范 例 :
DataFile = "invent.rpt"
system( "rm " DataFile )
说明 :
(a)system("字符串")指令接受一个字符串当成Shell的命令. 上例中, 使用一个字串常数"rm " 连接(concate)一个变量 DataFile 形成要求 Shell 执行的命令.Shell 实际执行的命令为 "rm invent.rpt".
"|" pipe指令
"|" 配合 awk 输出指令, 可把 output 到 stdout 的资料继续转送给Shell 上的某一命令当成input的资料.
"|" 配合 awk getline 指令, 可呼叫 Shell 执行某一命令, 再以 awk 的 getline 指令将该命令的所产生的资料读进 awk 程序中.
范 例 :
{ print $1, $2 * $3 | "sort -k 1 > result" }
"date" | getline Date_data