Hello World!
就像每本编程书开始时那样,总会放置一个Hello World! 章节,用来以最快的速度带领用户进入新语言的世界,现在就来打开你的服务器命令行窗口,让我们开启awk的Hello World! 之旅吧。
$echo ""|awk '{print("Hello World!");}'
Hello World!
在命令行中输入上方的程序行,并查看输出
发生了什么
语句中首先通过echo
命令输出一个空行,然后以管道的方式传递给awk
解析器作为参数,其中单引号与花括号包围的是程序逻辑,这里使用awk内置函数print()
向屏幕输出文本内容。
事实上花括号中的内容写成print "Hello World!"
更符合脚本语言的习惯,不过本书中还是坚持使用C风格的方式,即,函数调用添加圆括号,行尾添加分号结束。
是什么
GAWK(1) Utility Commands GAWK(1)
NAME
gawk - pattern scanning and processing language
查看awk的帮助文档,可以看到官方对awk的定义是“样式扫描处理语言”,简单来说就是对数据文件进行逐行扫描、处理的一种程序语言。
让我们来通过对前面程序的改造加深一下这种认识:
113.105.137.21 - - [21/Jul/2015:14:34:11 +0800] "GET /AwkInAction/gitbook/images/favicon.ico HTTP/1.1" 200 4286 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0"
113.105.137.21 - - [21/Jul/2015:14:34:13 +0800] "GET /AwkInAction/gitbook/app.js HTTP/1.1" 200 204751 "http://book.saubcy.com/AwkInAction/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0"
113.105.137.21 - - [21/Jul/2015:14:34:16 +0800] "GET /AwkInAction/gitbook/fonts/opensans/400.woff HTTP/1.1" 200 67524 "http://book.saubcy.com/AwkInAction/gitbook/style.css" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0"
chapter_1_1-1.data是服务器日志的截取,总共有3行内容,程序代码不变只是我们将原来的管道传参方式调整为文件方式,可以发现“Hello World!”输出了3次,也就是每行数据都会触发一次花括号中的程序逻辑执行。
$awk '{print("Hello World!");}' chapter_1_1-1.data
Hello World!
Hello World!
Hello World!
怎么运行
前面的例子中我们是直接把运行程序写在的命令行中,这种方式只适合一些临时性的简单处理,对于周期性或是复杂的处理通常的做法是将程序保存到一个单独的文件中,就类似于c程序那样,如:
{ print("Hello World!"); }
$awk -f chapter_1_1-1.awk chapter_1_1-1.data
Hello World!
Hello World!
Hello World!
可以看到执行效果完全一样,但是单独的文件在代码可读性或是维护性来说都要比命令行方式好的多。