若是要格式化报文或从一个大的文本文件中抽取数据包,那么awk能够完成这些任务。它
在文本浏览和数据的熟练使用上性能优异。
能够说awk是一种自解释的编程语言,之因此要在shell中使用awk
是由于awk自己是学习的好例子,但结合awk与其余工具诸如grep和sed,将会使shell编程更加
容易。
一、调用awk
第一种是命令行方式
awk [-Ffield-separator] 'commands' input-file
第二种方法是将全部awk命令插入一个文件,并使awk程序可执行,而后用awk命令解释
器做为脚本的首行,以便经过键入脚本名称来调用它。
第三种方式是将全部的awk命令插入一个单独文件,
awk -f awk-scripts-file input-file
-f选项指明在文件awk_script_file中的awk脚本,input_file(s)是使用awk进行浏览的文件
名。
二、awk脚本
在命令中调用awk时,awk脚本由各类操做和模式组成。
若是设置了-F选项,则awk每次读一条记录或一行,并使用指定的分隔符分隔指定域,但
若是未设置-F选项,awk假定空格为域分隔符,并保持这个设置直到发现一新行。当新行出现
时,awk命令获悉已读完整条记录,而后在下一个记录启动读命令,这个读进程将持续到文件
尾或文件再也不存在
2-一、模式和动做
任何awk语句都由模式和动做组成。在一个awk脚本中可能有许多语句。模式部分决定动
做语句什么时候触发及触发事件。处理即对数据进行的操做。若是省略模式部分,动做将时刻保
持执行状态。
模式能够是任何条件语句或复合语句或正则表达式。模式包括两个特殊字段BEGIN和
END。使用BEGIN语句设置计数和打印头。BEGIN语句使用在任何文本浏览动做以前,以后
文本浏览动做依据输入文件开始执行。END语句用来在awk完成文本浏览动做后打印输出文
本总数和结尾状态标志。若是不特别指明模式,awk老是匹配或打印行数。
实际动做在大括号{}内指明。动做大多数用来打印,可是还有些更长的代码诸如if和循环
(looping)语句及循环退出结构。若是不指明采起动做,awk将打印出全部浏览出来的记录。
下面将深刻讲解这些模式和动做
2-二、域和记录
awk执行时,其浏览域标记为$1,$2...$n。这种方法称为域标识。使用这些域标识将更容
易对域进行进一步处理。
使用$1,$3表示参照第1和第3域,注意这里用逗号作域分隔。若是但愿打印一个有5个域
的记录的全部域,没必要指明$1,$2,$3,$4,$5,可以使用$0,意即全部域。Awk浏览时,到达一新
行,即假定到达包含域的记录末尾,而后执行新记录下一行的读动做,并从新设置域分隔。
注意执行时不要混淆符号$和shell提示符$,它们是不一样的。
为打印一个域或全部域,使用print命令。这是一个awk动做(动做语法用圆括号括起来)。
保存awk输出
有两种方式保存shell提示符下awk脚本的输出。最简单的方式是使用输出重定向符号>文
件名,下面的例子重定向输出到文件wow。
awk '{print $0}' somefile >wow
第二种方法是使用 tee命令,在输出到文件的同时输出到屏幕。
使用标准输入
scripts.awk somefile
或者
scripts.awk <somefile
somefile | scripts.awk
打印报告头
打印信息头放置在 B E G I N模式部分,由于打印信息头被界
定为一个动做,必须用大括号括起来。
awk 'BEGIN{print "Name Belt\n------------------"}
{print $1"\t"$4}' somefile
打印信息尾
若是在末行加入end of report信息,可以使用END语句。END语句在全部文本处理动做执行
完以后才被执行。END语句在脚本中的位置放置在主要动做以后。
awk 'BEGIN{print "Name Belt\n------------------"}
{print $1"\t"$4} somefile
END {"end-of-report"}' somefile
awk错误信息提示
当第一次使用awk时,可能被错误信息搅得不知所措,但经过长时间和不断的学习,可总
结出如下规则。在碰到awk错误时,可相应查找:
确保整个awk命令用单引号括起来。
确保命令内全部引号成对出现。
确保用花括号括起动做语句,用圆括号括起条件语句。
可能忘记使用花括号,也许你认为没有必要,但awk不这样认为,将按之解释语法。
元字符
\ ^ $ . [] | () * + ?
+ 使用+匹配一个或多个字符。
? 匹配模式出现频率。例如使用/XY?Z/匹配XYZ或YZ。
awk内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行-F选项
NF 浏览记录的域个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
ARGC 支持命令行中传入awk脚本的参数个数。ARGV是ARGC的参数排列数组,其中每
一元素表示为ARGV[n],n为指望访问的命令行参数。
ENVIRON 支持系统设置的环境变量,要访问单独变量,使用实际变量名,例如
ENVIRON[“EDITOR”]=“Vi”。
FILENAME 支持awk脚本实际操做的输入文件。由于awk能够同时处理许多文件,所以如
果访问了这个变量,将告之系统目前正在浏览的实际文件。
FNR 支持awk目前操做的记录数。其变量值小于等于NR。若是脚本正在访问许多文件,
每一新输入文件都将从新设置此变量。
FS 用来在awk中设置域分隔符,与命令行中-F选项功能相同。缺省状况下为空格。若是用
逗号来做域分隔符,设置FS=","。
NF 支持记录域个数,在记录被读以后再设置。
OFS 容许指定输出域分隔符,缺省为空格。若是想设置为#,写入OFS="#"。
ORS 为输出记录分隔符,缺省为新行(\n)。
RS 是记录分隔符,缺省为新行(\n)。
内置的字符串函数
gsub(r,s)在整个$0中用s替代r
gsub(r,s,t)在整个t中用s替代r
index(s,t)返回s中字符串t的第一位置
length(s)返回s长度
match(s,r)测试s是否包含匹配r的字符串
split(s,a,fs)在fs上将s分红序列a
sprint(fmt,exp)返回经fmt格式化后的exp
sub(r,s)用$0中最左边最长的子串代替s
substr(s,p)返回字符串s中从p开始的后缀部分
substr(s,p,n)返回字符串s中从p开始长度为n的后缀部分
正则表达式