原文:http://doc.lazyhack.net/awk.htm

awk 程序中使用 Shell 命令

awk程序中允许呼叫Shell指令并提供管道解决awk与系统间数据传递的问题所以awk很容易使用系统资源.主要有两种方式:

a. 语法] awk output 指令 | "Shell 接受的命令"(  : print $1,$2 | "sort -k 1" )

[b. 语法] "Shell 接受的命令" | awk input 指令 : "ls " | getline)

 :

awk input 指令只有 getline 一个.

awk output 指令有 print, printf() 二个.

语法中, awk所输出的数据将转送往 Shell ,  Shell 的命令进行处理.以上例而言, print 所输出的数据将经由 Shell 命令 "sort -k 1" 排序后再送往屏幕(stdout).

上例awk程序中, "print$1, $2" 可能反复执行很多次其输出的结果将先暂存于 pipe ,等到该程序结束时才会一并进行 "sort -k 1".

须注意二点 : 

1、不论 print $1, $2 被执行几次, "sort -k 1" 的执行时间是 "awk程序结束时",

2"sort -k 1" 的执行次数是 "一次".

 

 b 语法中, awk将先调用 Shell 命令其执行结果将通过 pipe 送入awk程序,以上例而言, awk先让 Shell 执行 "ls",Shell 执行后将结果存于 pipe, awk指令 getline再从 pipe 中读取数据.

使用本语法时应留心以上例而言,awk "立刻"调用 Shell 来执行 "ls", 执行次数是一次.

getline 则可能执行多次(pipe中存在多行数据). 

例子:对进程PID进行排序

ps -ef|awk '{print $2|"sort -n"}'

awk的结果pid值,存到pipe中当程序结束时一次性传给“sort -n来进行排序,并输出到标准输出,此外可以调用close(sort -n)来关闭“sort -n”前的pipe并立刻将“sort -n”交给shell执行。

例子:打印在线人数

awk 'BEGIN{while ("who"|getline) n++;print n}'

打印当前的在在线人数

说明:awk不一定要处理文件,BEGIN会在尚未开启任何输入文件前,被执行一次,awk把“|”管道符号前面的字符串当成shell上的命令,并将命令送往shell,执行结果则由pipe送进awk程序中,getlineawk的提供的输入指令

语法

由何处读取数据

数据读入后置于

getline var < file

所指定的 file

变量 var(var省略时,表示置于$0)

getline var

pipe 变量

变量 var(var省略时,表示置于$0)

 Pattern  BEGIN  END , getline 将由 stdin 读取数据否则由awk正处理的数据文件上读取数据.

getline 一次读取一行数据若读取成功则return 1, 若读取失败则return -1, 若遇到文件结束(EOF), return 0false