Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19882338
  • 博文数量: 679
  • 博客积分: 10495
  • 博客等级: 上将
  • 技术积分: 9308
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-18 10:51
文章分类

全部博文(679)

文章存档

2012年(5)

2011年(38)

2010年(86)

2009年(145)

2008年(170)

2007年(165)

2006年(89)

分类:

2008-08-20 10:54:47

AWK 入门

 

磁针石

联系方式: gmail and gtalk: xurongzhong#gmail.com

 

参考资料

Automating UNIX and Linux Administration》之 “A.6 awk

LINUXUNIX SHELL编程指南》第9“AWK介绍――未整理完

 

     调用方法:

1,直接执行 awk -F: '{if ($4 && ($1 != $4)) print $1}' /etc/group

2, awk命令放入文件,awk -F: -f test.awk /etc/group

3, 制作awk脚本

 

     域和记录

编号从$1开始,$0表示所由域。

 

任何awk语句都由模式和动作组成。在一个awk脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保持执行状态。

模式可以是任何条件语句或复合语句或正则表达式。模式包括两个特殊字段BEGIN

END。使用BEGIN语句设置计数和打印头。BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行。END语句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志。如果不特别指明模式, awk总是匹配或打印行数。

实际动作在大括号{ }内指明。动作大多数用来打印,但是还有些更长的代码诸如if和循环(looping)语句及循环退出结构。如果不指明采取动作, awk将打印出所有浏览出来的记录。

t,\n 等也可以在打印中使用。

     条件操作符<小于>= 大于等于

<=小于等于~ 匹配正则表达式

== 等于!~ 不匹配正则表达式

!= 不等于

 

操作符列表:

= += *= / = %= ^ = 赋值操作符

条件表达操作符

|| && ! 并、与、非(上一节已讲到)

~!~ 匹配操作符,包括匹配和不匹配

< <= == != >> 关系操作符

+ - * / % ^ 算术操作符

+ + -- 前缀和后缀

     awk内置变量

ARGC 命令行参数个数

ARGV 命令行参数排列

RNVIRON支持队列中系统环境变量的使用

FILENAME浏览的文件名

FNR 浏览文件的记录数

FS 设置输入域分隔符,等价于命令行- F选项

NF 浏览记录的域个数

NR 已读的记录数

OFS 输出域分隔符

ORS 输出记录分隔符

RS 控制记录分隔符

 

     常见awk内置字符串函数
index(in, find) :
返回字符串in中字符串find第一次出现的位置(索引从1开始),如果在字串in中找不到字符串find,则返回值为0eg: print index("peanut","an") 会印出3
length(s) :
求出字符串s的字符个数。eg: length("abcde") 5
match(s,r) :
返回模式字符串r在字符串s的第一次出现的位置,如果s不包含r,则返回值0
sprintf(fmt,exp1,...) :
printf类似印出,是sprintf不是打印而是返回经fmt格式化后的exp
eg: sprintf("pi = %.2f (approx.)",22/7)
传回的字串为"pi = 3.14 (approx.)"
sub(p, r,t) :
在字符串t中寻找符合模式字符串p的最靠前最长的位置,并以字符串r代替最前的p
eg: str = "water, water"sub(/at/, "ith",str)
结果字符串str 会变成"wither, water"
gsub(p, r, t) : gsub
sub类似。不过时在字符串t中以字符串r 代替所有的p
eg: str="water, water" ; gsub(/at/, "ith",str)
结果字符串str会变成"wither,wither"
substr(str, st, len) :
传回str的子字符串,其长度为len字符,从str的第st个位置开始。如果len没有出现,则传回的子字符串是从第st个位置开始至结束。
eg: substr("washington",5,3)
传回值为"ing"
substr("washington",5)
传回值为"ington"
split(s,a,fs) :
在分隔符fs为分隔符将字符串s分隔成一个awk数组a,并返回a的下标数。
eg: awk 'BEGIN{print split("123#456#789",myarray,"#")}'
将打印 3
tolower(str) :
将字符串str的大写字母改为小写字母。
eg: tolower("MiXeD cAsE 123")
传回值为"mixed case 123"
toupper(str) :
将字符串string 的小写字母改为大写字母。
eg: toupper("MiXeD cAsE 123")
传回值为"MIXED CASE 123"
3)
常见awk内置系统函数
close(filename) :
将输入或输出的文件filename 关闭。
system(command) :
此函数允许调用操作系统的指令,执行完毕後将回到awk程序。
eg: awk 'BEGIN {system("ls")}'

 

实例:

 
% awk -F: '{print $1}' /etc/passwd
 
# ps uwx | awk '{print $2}'
PID
1
2
3
4
5
6
7
8
9
 
要去掉PID,修改如下:
# ps auwx | awk '!/^USER/ {print $2}' 
1
2
3
4
5
6
7
8
9
 
% awk -F: '{if ($4 && ($1 != $4)) print $1}' /etc/group
4列有东东,而且和第一列不同。
改用文件:
% awk -F: -f test.awk /etc/group
test.awk的内容如下:
 
{
   if ($4 && ($1 != $4))
      print $1
}
 

 

 

       Awk可以用多个空格作为分隔,cut只能使用单个空格。

 

建议的参考资料:The Awk Programming Language

阅读(5203) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~