分类:
2008-08-20 10:54:47
AWK 入门
磁针石
联系方式: gmail and gtalk: xurongzhong#gmail.com
*《Automating
UNIX and Linux Administration》之 “A.6 awk”
*《LINUX与UNIX
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,则返回值为0。eg: 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 = %.
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