上一部分主要是认识awk编程模型及简单示例,见
http://tonylee0329.iteye.com/admin/blogs/1810758
本节主要讨论awk中的运算符和表达式
A.1 记录和域
awk中认为文本文件的一行即是一条记录,一条记录由多个域构成,
以下:awk test by tony
包含四个域,由空格进行分割。
用'$n'标识域的值,如$1=awk.
注:$0表示全部域。
域操作符后面还可以跟变量,示例:
[lidc@hd66 awk-experiment]$ echo 'awk test by tony'>input
[lidc@hd66 awk-experiment]$ cat input
awk test by tony
[lidc@hd66 awk-experiment]$ awk 'BEGIN {start=1;end=3} {print $(start+end)}' input
tony
awk默认的分隔符是空格,TAB被认为是连续的空格键来处理,我们可以使用-F来自定义分隔符
awk -F"~==~" '{...}' input
还可以预先设置awk的环境变量FS,指定分隔符
[lidc@hd66 awk-experiment]$ awk 'BEGIN {FS=","} {print $0}' input
tony , 23 , male
emma , 23 , female
[lidc@hd66 awk-experiment]$ awk 'BEGIN {FS=","} {print $2}' input
23
23
A.2 运算符
awk运算符常见的都有如:
大于 >
小于 <
大于等于 >=
小于等于 <=
等于 ==
不等于 !=
逻辑或 ||
逻辑与 &&
逻辑非 !
不常见的是以下两个
~ 匹配正则表达式
!~ 不匹配正则表达式
举个匹配正则的例子:
[lidc@hd66 awk-experiment]$ awk -F":" '$0~/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
记录中只要匹配root即可
awk的条件语句及运算符使用示例:
[lidc@hd66 awk-experiment]$ awk -F":" '{if($3==10 || $4==0) print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
A.3 表达式
awk表达式用于存储、操作和获取数据,一个awk表达式可由数值、字符常量、变量、操作符、函数和正则自由组合而成
变量名:
只能包含字母、数字、下划线
不能以数字开头
区分大小写
变量可进行加、减、乘、除、乘方、取模等操作
小练习:求学生三科平均成绩
[lidc@hd66 awk-experiment]$ cat score
tony , 23 , male,90,90,93
emma , 23 , female,100,80,90
[lidc@hd66 awk-experiment]$ cat getAvgScore.awk
#!/bin/awk -f
BEGIN {FS=","}
{
total=$4+$5+$6
avg=total/3
print $1,avg
}
[lidc@hd66 awk-experiment]$ awk -f getAvgScore.awk > students-score
[lidc@hd66 awk-experiment]$ awk -f getAvgScore.awk score > students-score
[lidc@hd66 awk-experiment]$ cat students-score
tony 91
emma 90