一、语法
命令的语法始终:
awk 'pattern {action}'
其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号 ({}) 不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。action参数总是被大括号包围,它由一系列awk语句组成,各语句之间用";"分隔。
你可以省略pattern和 action之一,但不能两者同时省略,当省略pattern时没有样式匹配,
表示对所有行(记录)均执行操作,省略action时执行缺省的操作——在标准输出上显示。
awk处理的工作与
数据库的处理方式有相同之处,其相同处之一就是awk支持对
记录和字段的处理,其中对字段的处理是grep和sed不能实现的,这也是awk优于二者的原因之一。在awk中,缺省的情况下总是将文本文件中的
一行视为一个记录,而将一行中的某一部分作为记录中的一个字段。为了操作这些不同的字段,awk借用shell的方法,
用1,2,3...这样的方式来顺序地表示行(记录)中的不同字段。特殊地,
awk用0表示整个行(记录)。不同的
字段之间是用称作分隔符的
字符分隔开的。
系统默认的分隔符是空格。awk允许在命令行中用
-F re的形式来改变这个
分隔符。事实上,awk用一个内置的变量FS来记忆这个
分隔符。awk中有好几个这样的内置变量,例如,记录
分隔符变量RS、
当前工作的记录数NR等等,本文后面的附表列出了全部的内置变量。这些内置的变量可以在awk程序中引用或修改,例如,你可以利用NR变量在模式匹配中指定工作范围,也可以通过修改记录
分隔符RS让一个特殊字符而不是换行符作为记录的分隔符。
二、函数
内置的字符串函数
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的后缀部分
|
gsub函数有点类似于sed查找和替换。它允许替换一个字符串或字符为另一个字符串或字符,并以
正则表达式的形式执行。第一个函数作用于记录$0,第二个gsub函数允许指定目标,然而,如果未指定目标,缺省为$0。
index(s,t)函数返回目标字符串s中查询字符串t的首位置。length函数返回
字符串s字符长度。
match函数测试字符串s是否包含一个
正则表达式r定义的匹配。
split使用域
分隔符fs将字符串s划分为指定序列a。
sprint函数类似于printf函数,返回基本输出格式fmt的结果字符串exp。
sub(r,s)函数将用s替代$0中最左边最长的子串,该子串被r匹配。
sub(s,p)返回字符串s在位置p后的后缀。
substr(s,p,n)同上,并指定子串长度为n。
三、实例
例:显示文本文件mydoc匹配(含有)字符串"sun"的所有行。
awk '/sun/' mydoc
由于
显示整个记录(全行)是awk的缺省动作,因此可以省略action项。
awk '/sun/' mydoc
例:下面是一个较为复杂的匹配的示例:
awk '/[Ss]un/,/[Mm]oon/ ' myfile
它将显示第一个匹配Sun或sun的行与第一个匹配Moon或moon的行之间的行,并显示到标准输出上。
awk 'length($0)>80 {print NR}' myfile
例:作为一个较为实际的例子,我们假设要对UNIX中的用户进行安全性检查,方法是考察/etc下的passwd文件,检查其中的passwd字段(第二字段)是否为"*",如不为"*",则表示该用户没有设置密码,显示出这些用户名(第一字段)。我们可以用如下语句实现:
#awk -F: '$2!="*" {printf("%s no password!\n",$1)'} /etc/passwd
四、高级编程(待完善)
变量
内置变量(一般大写)
内置变量不需要使用标志符""
自定义变量
自定义变量必须在它前面加上标志符""