awk
awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息。awk抽取信息
后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。
有三种方式调用awk
第一种:命令模式
awk [-F 域分隔符] commands inputfile 如果浏览器有空格做分隔符,可以不使用-F
以冒号为分隔符,以-F来指明选项 比如passwd这个文件
awk -F : "command inputfile"
第二种方法是将所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释
器作为脚本的首行,以便通过键入脚本名称来调用它。
第三种方式是将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file inputfile
-f选项指明在文件awk_script_file中的a w k脚本,inputfile是使用awk进行浏览的文件名。
awk脚本
在命令中调用awk时,awk脚本由各种操作和模式组成。
如果设置了-F选项,则awk每次读一条记录或一行,并使用指定的分隔符分隔指定域,但
如果未设置-F选项,awk假定空格为域分隔符,并保持这个设置直到发现一新行。当新行出现
时,awk命令获悉已读完整条记录,然后在下一个记录启动读命令,这个读进程将持续到文件
尾或文件不再存在。
参照表9 - 1,awk每次在文件中读一行,找到域分隔符(这里是符号#),设置其为域n,直
至一新行(这里是缺省记录分隔符),然后,划分这一行作为一条记录,接着awk再次启动下
一行读进程。
表9-1 awk读文件记录的方式
域1 分隔符域2 分隔符域3 分隔符域4及换行
P. B u n n y (记录1 ) # 0 2 / 9 9 # 4 8 # Yellow \n
J . Tr o l l (记录2 ) # 0 7 / 9 9 # 4 8 4 2 # Brown-3 \n
模式和动作
模式和动作
任何awk语句都由模式和动作组成。在一个awk脚本中可能有许多语句。模式部分决定动
作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保
持执行状态。
模式可以是任何条件语句或复合语句或正则表达式。模式包括两个特殊字段BEGIN和END。
使用BEGIN语句设置计数和打印头。BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行。END语句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志。如果不特别指明模式, awk总是匹配或打印行数。
实际动作在大括号{ }内指明。动作大多数用来打印,但是还有些更长的代码诸如if和循环
(looping)语句及循环退出结构。如果不指明采取动作,awk将打印出所有浏览出来的记录。
域和记录
域$1,$2,$3......$n 中间用逗号隔开 如果打印 就用print 所有域表示$0
保存awk输出
有两种方式保存shell提示符下awk脚本的输出。最简单的方式是使用输出重定向符号>文
件名,下面的例子重定向输出到文件wow
awk '{print $0}' awk1.txt > wow
awk在重定向中一般是不会显示出结果的,因为它已经被保存到文件中,如果要在屏幕输出结果可以加上 | tee filename
awk '{print $0}' awk1.txt | tee wow
使用标准输入
在深入讲解这一章之前,先对awk脚本的输入方法简要介绍一下。实际上任何脚本都是从
标准输入中接受输入的。为运行本章脚本,使用awk脚本输入文件格式,例如:
也可替代使用下述格式: belts.awk wow.txt
使用重定向方法:belts.awk < wow.txt
或管道方法:wow.txt | belts.awk
打印报告头
上述命令输出在名字和腰带级别之间用一些空格使之更容易划分,也可以在域间使用tab键加以划分。为加入tab键,使用tab键速记引用符\t,也可以为输出文本加入信息头。本例中加入name和belt及下划线。下划线使用\n,强迫启动新行,并在\n下一行启动打印文本操作。打印信息头放置在BEGIN模式部分,因为打印信息头被界定为一个动作,必须用大括号括起来。在awk查看第一条记录前,信息头被打印。
awk 'BEGIN {print "name belt\n--------------------"}{print $1\t$3}' awk1.txt
打印信息尾
如果在末行加入end of report信息,可使用END语句。END语句在所有文本处理动作执行完之后才被执行。END句在脚本中的位置放置在主要动作之后。下面简单打印头信息并告之查询动作完成。
awk 'BEGIN {print "name belt\n--------------------"}{print $1\t$3} END {"end of report"} awk1.txt '
当第一次使用awk时,可能被错误信息搅得不知所措,但通过长时间和不断的学习,可总
结出以下规则。在碰到awk错误时,可相应查找:
确保整个awk命令用单引号括起来。
确保命令内所有引号成对出现。
确保用花括号括起动作语句,用圆括号括起条件语句。
可能忘记使用花括号,也许你认为没有必要,但awk不这样认为,将按之解释语法。
awk中正则表达式及其操作
在grep一章中,有许多例子用到正则表达式,这里将不使用同样的例子,但可以使用条
件操作讲述awk中正则表达式的用法。
这里正则表达式用斜线括起来。例如,在文本文件中查询字符串green,使用/green/可以
查出单词green的出现情况。
元字符
这里是awk中正则表达式匹配操作中经常用到的字符。
\ ^ $ . [] | () * + ?
这里有两个字符只适用于awk而不适用于grep或sed。它们是:
+ 使用+匹配一个或多个字符。
? 匹配模式出现频率。例如使用/XY?Z/匹配XYZ或YZ。
awk条件操作符
操作符描述操作符描述
< 小于
> = 大于等于
< = 小于等于
~ 匹配正则表达式
= = 等于
!~ 不匹配正则表达式
!= 不等于
设置大小写
为查询大小写信息,可使用[ ]符号。在测试正则表达式时提到可匹配[ ]内任意字符或单词,
因此若查询文件中级别为green的所有记录,不论其大小写,表达式应为"/[Gg]reen/"
任意字符
抽取名字,其记录第一域的第四个字符是a,使用句点.。表达式/^...a/意为行首前三个字
符任意,第四个是a,尖角符号代表行首。
行首
不必总是使用域号。如果查询文本文件行首包含48的代码,可简单使用下面^符号:
awk '/^48/' awk1.txt
复合模式或复合操作符用于形成复杂的逻辑操作,复杂程度取决于编程者本人。有必要
了解的是,复合表达式即为模式间通过使用下述各表达式互相结合起来的表达式:
&& and 语句两边必须同时匹配为真。
|| or 语句两边同时或其中一边匹配为真。
! 非 求逆
所有的匹配 用小括号包含
awk内置变量
awk有许多内置变量用来设置环境信息。这些变量可以被改变。
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行- F选项
NF 浏览记录的域个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
awk操作符
在awk中使用操作符,基本表达式可以划分为数字型、字符串型、变量型、域及数组元素。
= += *= / = %= ^ = 赋值操作符
? 条件表达操作符
|| && ! 并、与、非
~!~ 匹配操作符,包括匹配和不匹配
< <= == != >> 关系操作符
+ - * / % ^ 算术操作符
+ + -- 前缀和后缀