一、AWK基本介绍
AWK,它的名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母,有的地方说AWK是AWK是一种优良的文本处理工具 ,但它更是一个小型的编程语言,广泛应用LINUX环境中,帮助我们进行流控制、数学运算、进程控制语句甚至于内置的变量和函数。它可以做的事情很多,像任何其它语言如C、C++、JAVA一样,你可以用它来做你想做的任何事情,这取决于你能够想到把它用来干什么。我们可以用它来创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表等等功能,它有着像C及JAVA一样的语言格式,因而对于C及JAVA语言的开发者来说,要熟悉AWK那是非常容易的,需要做的就是记一些它特定的命令而已。
AWK的功能太强大了,不可能用简单的语言来中概括,我这里简单的说明一下它的语言结构,以及后面我会使用一个简单的统计示例来说明它的使用。
语法结构:
- awk
- 'BEGIN
- {
- #定义及预处理
- }
- {
- #处理代码,这里根据输入做处理,如果输入是多行的会做循环处理
- }
- END
- {
- #结果输出
- }'
以下说明一下这种结构:
1、awk为命令;
2、在BEGIN块的第一个花括号"{}"中,可以定义一些变量或者做一些预处理,以便我们在后面可以使用这些变量,在这里定义的变量是作为全局变量使用的,并且这里执行的动作是在第一个输入行读入之前进行的,也就是说在处理输入内容时,首先执行的是这里的逻辑代码;
3、第二个花括号"{}"中,用于对输入内容的处理,因为awk是输入,如果没在输入操作行,它将什么也不能够做(除了上面提到的第一个花括号"{}"中逻辑,因为上面的动行是在输入之前进行的操作),如果有多条输入行,那这里将对每个输入行做循环的处理;
4、END的花括号"{}"中,我们可以对花括号"{}"中执行的结果逻辑,进行再处理,如将统计结果求平均等操作。
二、AWK语法结构介绍
上面有提到AWK是一种编程语言,那它肯定有自己的逻辑处理结构,和C、JAVA语言非常相似,你如果是C、JAVA的开发者,保你一看就会,看下面的关系符介绍和流程控制语句吧。
1、关系操作符和布尔操作符:
操作符 |
描述 |
< |
小于 |
> |
大于 |
<= |
小于等于 |
>= |
大于等于 |
== |
等于 |
!= |
不等于 |
上面的都看着很眼熟吧!
2、IF条件判断:
语法格式:
- if(expression){
- action1
- }else{
- action2
- }
多IF判断:
- if(expression1){
- action1
- }else if(expression2){
- action2
- }else{
- action3
- }
简单示例:
- if(a<100){
- b=1
- }else if(a>=100 && a<1000){
- b=2
- }else{
- b=3
- }
2、条件操作符:
语法格式:
- expr ? action1 : action2
简单示例:
- grade = (avg>=60) ? "pass":"fail"
3、WHILE循环:
语法格式:
- while(condition){
- action
- }
- 或者
- do{
- action
- } while(condition)
简单示例:
- BEGIN{
- while(x<4){
- print x
- x++
- }
- }
- 或
- BEGIN{
- do{
- print x
- x++
- }while(x<4)
- }
4、FOR循环:
语法格式:
- for(first; end; increment){
- action
- }
简单示例:
- for(x=1;x<4;x++){
- print x
- }
怎么样,很眼熟吧,呵,这就是AWK的语法结构。
三、简单示例
这里举一个非常简单的示例,就是将你机器上运行着的JAVA进行的PID给加起来,然后求平均输出,看以下的示例代码:
1、先通过JPS查看本机的JAVA进程,以便后面验证是否正确:
- $ jps
- 4088
- 14134
- 5325 Main
- 6324 Jps
通过编写简单的AWK脚本:
- jps|awk '
- BEGIN{pid=0;pidnum=0}
- {
- pid=pid+$1;
- pidnum=pidnum+1
- }
- END{print "average pid:" pid/pidnum}'
可以得到如下结果:
average pid:7499.25
当然上面的命令是可以不换行编写的:
- jps|awk 'BEGIN{pid=0;pidnum=0}{pid=pid+$1;pidnum=pidnum+1}END{print "average pid:" pid/pidnum}'
这个示例到这里也就演示完了,做这样的统计确实是一点意义都没有,但是如果你有一个用户访问的COOKIE记录文件,并且每条访问记录都有记录响应时间,你觉得你能够用上面的示例做一些什么呢?我们不要的是结果,要的是如何去使用,至少如何使用,就看我们自己有什么样的需求了,这不是AWK所能够决定的了。
四、总结
这里只是简单的介绍了一下AWK的语法结构及简单示例,还有很多强大的功能,这个就需要我们大家一起去发掘了,这篇文章只是适合像我这样的初级用户,如果你是初次接触AWK,那就凑合着看吧。