• 抽取域。
• 匹配正则表达式。
• 比较域。
• 向a w k传递参数。
• 基本的a w k行操作和脚本
9.1 调用awk
有三种方式调用a w k,第一种是命令行方式,如:
$ awk [-F field-separator] 'commands' input-file
这里,c o m m a n d s是真正的a w k命令。本章将经常使用这种方法
9.2.1 模式和动作
任何a w k语句都由模式和动作组成。在一个 a w k脚本中可能有许多语句。模式部分决定动
作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保
持执行状态。
模式可以是任何条件语句或复合语句或正则表达式。模式包括两个特殊字段 B E G I N和
E N D。使用B E G I N语句设置计数和打印头。 B E G I N语句使用在任何文本浏览动作之前,之后
文本浏览动作依据输入文件开始执行。 E N D语句用来在 a w k完成文本浏览动作后打印输出文
本总数和结尾状态标志。如果不特别指明模式, a w k总是匹配或打印行数。
实际动作在大括号 { }内指明。动作大多数用来打印,但是还有些更长的代码诸如 i f 和循环
(l o o p i n g)语句及循环退出结构。如果不指明采取动作, a w k将打印出所有浏览出来的记录
9.2.2 域和记录
为打印一个域或所有域,使用 p r i n t命令。这是一个a w k动作(动作语法用圆括号括起来)
$ awk '{print $1,$4}' text.txt
注意,此处是单引号,不能是双引号
打印报告头
awk -F" " 'BEGIN {print "name \t name\n-------------"} {print $3,$4}' awk.txt
awk -F" " 'BEGIN {print "name name\n-------------"}{print $3,$4} END {print "this is end"}' awk.txt
当第一次使用 a w k时,可能被错误信息搅得不知所措,但通过长时间和不断的学习,可总
结出以下规则。在碰到 a w k错误时,可相应查找:
• 确保整个a w k命令用单引号括起来。
• 确保命令内所有引号成对出现。
• 确保用花括号括起动作语句,用圆括号括起条件语句。
• 可能忘记使用花括号,也许你认为没有必要,但 a w k不这样认为,将按之解释语法
9.2.4 元字符
这里是 a w k中正则表达式匹配操作中经常用到的字符,详细情况请参阅本书第 7章正则表
达式概述。
\ ^ $ . [] | () * + ?
这里有两个字符第 7章没有讲到,因为它们只适用于 a w k而不适用于 g r e p或s e d。它们是:
+ 使用+匹配一个或多个字符。
? 匹配模式出现频率。例如使用 /X Y?Z/ 匹配X Y Z或Y Z
1. 匹配
为使一域号匹配正则表达式,使用符号‘~’后紧跟正则表达式,也可以用 i f语句。 a w k
中i f 后面的条件用()括起来。
$ awk '{if($1~/rw/)print $0}' awk.txt
匹配记录找到时,如果不特别声明, a w k缺省打印整条记录
$ awk '$0~/rw/' awk.txt
上面只是一个命令,所以不需要用{}。如果是一条语句,需要用{}
为精确匹配 ,使用等号 = =,并用单引号括起条件
$ awk '{if($2=="1")print $0}' awk.txt
3. 不匹配
有时要浏览信息并抽取不匹配操作的记录,与 ~ 相反的符号是 !
~
,意即不匹配
其他关系符一样,不讲述
设置大小写
$ awk -F" " '/[Ww]angkjun/' awk.txt
$ awk -F" " '$0~/[Ww]angkjun/' awk.txt
8. 任意字符
使用.
$awk -F" " '$0~/^.........x/' awk.txt
第一行的最后一个字符是x
9.2.7 NF、NR和FILENAME
要快速查看记录个数,应使用 N R
$ awk -F" " 'END {print NR}' awk.txt
要快速查看域数,应使用NF
$awk -F" " '{print NF "\t" NR "\t" $0}' awk.txt
N F的一个强大功能是将变量 $ P W D的返回值传入a w k并显示其目录。这里需要指定域分隔
符/。
$ pwd
/usr/local/etc
$ echo $PWD |awk -F/ '{print $NF}'
另一个例子是显示文件名。
$ echo "/usr/local/etc/rc.sybase" | awk -F/ "{print $NF}"
rc.sybase
1. 设置输入域到域变量名
在a w k中,设置有意义的域名是一种好习惯,在进行模式匹配或关系操作时更容易理解。
一般的变量名设置方式为 n a m e = $ n,这里n a m e为调用的域变量名, n为实际域号。例如设置学
生域名为n a m e,级别域名为 b e l t,操作为 n a m e = $ 1 ; b e l t s = $ 4。注意分号的使用,它分隔 a w k命
令。下面例子中,重新赋值学生名域为 n a m e,级别域为 b e l t s。查询级别为 Ye l l o w的记录,并
最终打印名称和级别。