Awk是文本工具中最难掌握的,它借鉴了C 语言.python 和bash的一些精华部分。awk自解释型编程语言,它支持用户自定义函数和动态正则表达式等先进功能。
awk设计简单,速度表现很好,可结合Shell(w|awk…),它在命令行中使用,但多是作为脚本来使用。很多基于shell的日志分析工具可用它完成。
awk是那种一旦学会了就会成为您战略编码库的主要部分的语言。awk 能够用很短的程序对文档里的资料做修改.比较.提取.打印等处理,如果使用C或Pascal等完成上述的任务会十分不方便而且很花费时间,所写的程序也会很大。
一.awk模式扫描语言:ed→(sed&grep)→awk→perl
1.像shell一样awk也有几种(旧awk.新nawk.gawk兼容nawk)
awk:最初在1977年完成,支持幂 ^,getline,system等; |
nawk:(在 20世纪 80 年代中期,new awk)许多系统中旧的awk解释器通常安装为 oawk (old awk) 命令,而 nawk解释器则安装为nawk 命令。Dr. Kernighan仍然在对 nawk 进行维护,与 gawk一样,它也是开放源代码的,并且可以免费获得; |
gawk:是 GNU Project的awk解释器的开放源代码实现。尽管早期的 GAWK发行版是旧的 AWK 的替代程序,但不断地对其进行了更新,以包含 NAWK的特性; |
目前,大家都比较倾向于使用awk和gawk。 |
2.虽然awk与sed指令的结构相同,但awk与sed有以下不同
awk非常适合于结构化的文本文件(行.列数据)处理。相对于sed,它可进行复杂的编程处理,并且可以产生复杂的报表输出。
awk缺省情况下使用扩展的正则。 |
awk中用C函数取代了一两个字符的行编辑器命令集,如print取代了p。 |
awk倾向于一行当中分成数个字段来处理。 |
3.为了避免碰到awk错误总结出以下规律
指令必须包括单引号,因为$在shell中有特殊意义的。 |
因为模式和动作可有可无,确保用{}括起动作语句以便与模式相区别。 |
{}内的多个指令可用分号分隔,或直接以‘Enter’按键来隔开 |
用圆括号括起条件语句。 |
printf格式化输出时,务必加上\n,才能进行分行! |
字符串一定要保证被双引号括起来(在模式中除外)。 |
逻辑运算的‘等于’请务必使用两个等号‘==’ |
在awk当中变量可直接使用,不需加上$符号 |
二.awk的三种调用方式
1.awk [options] 'script' var=value file(s) ,有以下两个特例
# awk ‘pattern’ filename | # awk ‘{action}’ filename |
2.awk [options] -f scriptfile var=value file(s)
#cat my_awk( 要特别注意操作顺序和流程 ) /Sally/ {print “**** found Sally! ****”} {print $1, $2, $3} |
#awk -f my_awk employees |
3.#!/bin/nawk–f……执行:myscript.awk filename
三.记录和域字段
1.awk 程序数据处理流程
→读入第一行,并将第一行的资料填入$0,$1,$2. . .等变量当中; →依据“条件类型”的限制,判断是否需要进行后面的“动作”; →做完所有的动作与条件类型; |
→若还有后续的‘行’的数据,则重复上面的3个步骤,直到所有的数据都读完为止。 |
2.NR与NF(缺省的RS为\n,缺省的FS为Blank)
列出登陆历史用户中的每一行的账号,并且列出目前处理的行数,并且说明,该行有多少字段(注意,内容想要以print或printf打印时,非变量的文字部分,都需要使用双引号括住):
四.获得外部变量方法
1.获得普通外部变量
格式:awk ‘{action}’ 变量名=变量值,这样传入变量,可以在action中获得值。 注意:变量名与值放到’{action}’后面。 |
# test='awk code' # echo|awk '{print test}' test="$test" awk code |
# echo | awk 'BEGIN{print test}' test="$test" 在BEGIN的action不能获得 |
2.BEGIN程序块中变量
格式:awk –v 变量名=变量值 [–v 变量2=值2 …] 'BEGIN{action}’ |
# test='awk code' # echo | awk -v test="$test" 'BEGIN{print test}' awk code # echo | awk -v test="$test" '{print test}' awk code |
3.获得环境变量
#awk 'BEGIN{for (i in ENVIRON) {print i"="ENVIRON[i];}}'
LANG=en_US.UTF-8
.......
awk内置变量 ENVIRON,就可以直接获得环境变量。它是一个字典数组。环境变量名就是它的键值。