awk教程

AWK命令详解

一、语法

命令的语法始终:
 awk 'pattern {action}'
其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号 ({}) 不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。action参数总是被大括号包围,它由一系列awk语句组成,各语句之间用";"分隔。
你可以省略pattern和 action之一,但不能两者同时省略,当省略pattern时没有样式匹配, 表示对所有行(记录)均执行操作,省略action时执行缺省的操作——在标准输出上显示。
例:显示文本文件myfile中第七行到第十五行中以 字符%分隔的第一字段,第三字段和第七字段:
awk -F % 'NR==7,NR==15 {print $1 $3 $7}' myfile

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的行之间的行,并显示到标准输出上。
例:下面的示例显示了内置 变量内置函数length()的使用:
awk 'length($0)>80 {print NR}' myfile
该命令行将显示文本myfile中所有超过80个字符的 行号,在这里,用0表示整个记录(行),同时,内置 变量NR不使用标志符''。
例:作为一个较为实际的例子,我们假设要对UNIX中的用户进行安全性检查,方法是考察/etc下的passwd文件,检查其中的passwd字段(第二字段)是否为"*",如不为"*",则表示该用户没有设置密码,显示出这些用户名(第一字段)。我们可以用如下语句实现:
#awk -F: '$2!="*" {printf("%s no password!\n",$1)'} /etc/passwd
在这个示例中,passwd文件的字段 分隔符是“:”,因此,必须用-F:来更改默认的字段分隔符,这个示例中也涉及到了 内置函数printf的使用。

四、高级编程(待完善)

变量

内置变量(一般大写)
内置变量不需要使用标志符""
自定义变量
自定义变量必须在它前面加上标志符""



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值