一个典型的awk 程序指令是由模式(Pattern)和大括号括起来的操作(Action)组合而成的,具体格式如下:
Pattern { Action }
对于awk 读取的每条记录,如果一个记录与指定模式(Pattern)相匹配,或包含与该模式匹配的字段,那么执行相应的操作(Action)。
模式和操作可以任意省略其中的一个,如果省略模式,则操作会被应用到每条输入记录;如果省略操作,则默认操作为将匹配的记录打印到标准输出上。假设有一个名为 visitor 的文本文件,记录了某段时间访问Coding Ants的人,具体如下,中间用tab进行分割。
guangdong 121.8.171.* 15:18:23 www.google.com.hk guangdong 183.32.97.* 15:11:23 www.google.com tianjing 111.166.108.* 15:10:22 www.baidu.com guangdong 113.65.141.* 14:35:27 www.baidu.com shanghai 123.126.50.* 14:18:23 www.google.com.hk shanghai 117.136.0.* 14:17:23 www.google.com
visitor文件共有6行,每行由tab分割为4个部分,对awk 来说,这就是6条记录,每条记录包含4个字段!如果我们想查看来自广东的访问者,则可以执行下面的命令:
CodingAnts@ubuntu:~/awk$ cat visitor | awk '/guangdong/ {print $0}' guangdong 121.8.171.* 15:18:23 www.google.com.hk guangdong 183.32.97.* 15:11:23 www.google.com guangdong 113.65.141.* 14:35:27 www.baidu.com
上面蓝色部分的/guangdong/即为模式(Pattern),红色部分的print $0 为操作(Action)。上面的awk指令可以这样理解:awk读取visitor中的每条输入作为记录,然后将模式与记录进行匹配(查找记录中是否包含 guangdong 这个词),如果匹配,则执行操作(打印整条记录到标准输出)。
接下来,我们分别省略模式和操作,看看输出的结果有什么差异。
CodingAnts@ubuntu:~/awk$ cat visitor | awk '/guangdong/'
guangdong 121.8.171.* 15:18:23 www.google.com.hk
guangdong 183.32.97.* 15:11:23 www.google.com
guangdong 113.65.141.* 14:35:27 www.baidu.com
上面是省略操作后的输出,可以看出默认的操作就是 print $0,也就是打印整条记录!
CodingAnts@ubuntu:~/awk$ cat visitor | awk '{print $1,$4}'
guangdong www.google.com.hk
guangdong www.google.com
tianjing www.baidu.com
guangdong www.baidu.com
shanghai www.google.com.hk
shanghai www.google.com
省略模式后,可以看出awk对于每条记录都执行了对应的操作(打印第一个和第四个字段)!
总结下就是:模式(Pattern)用于筛选记录,操作(Action)用于处理字段!
转载请注明:Coding Ants » awk的程序指令模型