AWK工具学习(二)-运算符与表达式

上一部分主要是认识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

猜你喜欢

转载自tonylee0329.iteye.com/blog/1810765
今日推荐