1. 概述
grep、awk、sed被誉为linux“三剑客”,使用它们可以很好地处理文件。它们的侧重点又各有不同。其中,grep擅长查找功能,sed擅长取行和替换,awk擅长取列。本文重点介绍awk命令。
2. awk的语法
有三种方式可以调用awk:
1. awk [-F 域分隔符] ‘command’input-file(s)
[-F 域分隔符] 是可选的,使用其可以指定域分隔符,默认域分隔符为空格。如果需要指定域分隔符为:,则用如下命令:
awk –F: ‘command’input-file(s)
2. 将所有的awk命令放入一个文件中,赋予其可执行权限,然后用awk命令解释器作为脚本首行,以便通过键入脚本名称来调用。
3. 将所有awk命令放入一个文件中,然后调用:
awk –f awk-script-file input-file(s)
-f指明文件awk-script-file中的awk脚本,input-file(s)是使用awk进行浏览的文件名
任何awk语句都由模式和动作组成,模式决定awk语句何时触发以及触发事件,可以是任何条件语句或复合语句或正则表达式,模式包括两个特殊的字段BEGIN和END,使用BEGIN可以设置计数和打印头,END可以打印输出文本总数和结尾状态标志;动作即对数据进行的操作,实际动作均需要在 {} 内指明。举例如下,
Grade.txt文件内容为:

编辑
使用下述命令可以打印头和结尾状态:
awk 'BEGIN {print "Name\t Belt\n------------"} {print $1"\t"$4} END {print "over"}' grade.txt

编辑
3. 域和记录
awk执行时,其浏览域标记为$1,$2,…,$n,这种方法称为域标识。使用$1和$3表示第1域和第3域,可以理解为文件的第一列和第3列,若想表示所有域,可以使用$0,如上述文件内容中共有7个域,分别为名字、升段日期、学生序号、腰带级别、年龄、目前比赛积分、比赛最高分。
4. awk的使用
1)awk '{print $0}' grade.txt 打印所有记录
2)awk '{print $0}' grade.txt>wow 打印所有记录并保存到wow文件内,不在屏幕显示
3)awk '{print $0}' grade.txt | tee wow 打印所有记录到屏幕并保存到wow文件
4)awk '{print $1,$4}' grade.txt 打印第一列和第4列,注意加逗号分隔域
5. awk中正则表达式及其操作
awk中正则表达式要用斜线 // 括起来。例如,模式串为green,应该使用/green/。awk中的操作符有:
|
操作符 |
描述 |
|
< |
小于 |
|
> |
大于 |
|
<= |
小于等于 |
|
>= |
大于等于 |
|
== |
等于/精确匹配 |
|
!= |
不等于 |
|
~ |
匹配 |
|
!~ |
不匹配 |
1)查询第4域匹配Brown的记录 awk '{if($4~/Brown/) print $0}' grade.txt
2)查询记录中匹配Brown的记录 awk '$0~/Brown/' grade.txt
3)精准匹配 awk '$3=="48" {print $0}' grade.txt
4)查询第3域匹配48的记录 awk '{if($3~/48/) print $0}' grade.txt
5)不匹配 awk '$0!~/Brown/ {print $0}' grade.txt
6)只对第4域进行不匹配操作 awk '{if($4!~/Brown/) print $0}' grade.txt
7)大小写匹配 awk '/[Gg]reen/' grade.txt
8)或关系匹配 awk '$0~/(Yellow | Brown)/' grade.txt
9)打印记录,满足多个条件 &&
awk '{if($1=="P.Bunny" && $4=="Yellow") print $0}' grade.txt
10)打印记录,多个条件中满足一个即可 ||
awk '{if($4=="Yellow" || $4~/Brown/) print $0}' grade.txt




