网上关于awk的博客说的也是够多的了,之所以再写有两点原因:1 大部分博文说的不够全面 2 作为自己系统学习shell的一个记载。
学习过程中看的是《The awk programming language》讲的非常详细,有兴趣的同学可以在这里下载。
0. 以下示例说明均以此数据作为依据,文件名为countries
USSR 8649 275 Asia
Canada 3852 25 North America
China 3705 1032 Asia
USA 3615 237 North America
Brazil 3286 134 South America
India 1267 746 Asia
Mexico 762 78 North America
France 211 55 Europe
Japan 144 120 Asia
Germany 96 61 Europe
England 94 56 Europe
1. awk语法
awk的语法非常简单即:awk 'pattern {action}' file 其中pattern是每一行对应的匹配模式,也就是说只有当前行满足pattern模式,才会执行里面的action动作。action则是具体想要进行什么操作,比如数据计算 写文件 输出等。file则是要处理的数据文件,可以是一个或多个。当没有时,系统默认用户从命令行输入,直到遇到结束符。
比如如果我想把countries里的包含“America”这个字符串的行都输出,可以这样做:
awk '$0 ~ /America/ {print $0}' countries
上面语句中$0代表整行 ‘~’ 表示包含,/name/ 则表示包含“name”的字符串。
当然pattern并不是必须的,action也不是只能有一个。像这种语法格式也是正确的 awk ‘{acion} pattern {action}’。当没有pattern时,表示当前输入行总是满足条件;有多个pattern {action}模式时,awk 会在当前行执行完一组pattern {action} 模式后再执行下一组。
比如我想把countries中所有行都打印出来:
awk ‘{print $0}’ countries # 没有action,默认所有行都匹配
2. awk 中的关键字
这里只例举一些常用的关键字,不常用到的就不一一列举了。
下面通过几个例子说明各个关键字的用处
1)将countries中的所有数据打印出,并在开头打印出每个字段的意思
awk 'BEGIN {print "COUNTRY","","AREA"," ","POP"," ","CONTINENT"} {print }' countries
可以理解BEGIN的意思了吧? ps: 上面语句中{print}若后面没有参数则默认打印整行
2)将最后一行打印出来